HashSet和TreeSet

来源:互联网 发布:广告优化师 编辑:程序博客网 时间:2024/05/16 14:34

HashSet和TreeSet都是Set的实现

HashSet在存放元素时,会获取元素的hashCode()值,通过散列算法找到存放位置。HashSet通过equals()方法比较相等两个对象是否相等

当两个对象的hashCode()值一样,但是equals()返回值为false时会很麻烦,hashCode()值一样HashSet会试图把这两个元素保存在同一个地方,所以会将这两个元素以链表的形式存放在这个位置,因为HashSet访问元素是通过元素的hashCode()值来快速定位的,这种情况会导致HashSet的性能降低

当两个对象的hashCode()返回值不同,equals()返回值为true,则会把相同的元素添加两次,这样就和HashSet的规则(不可重复)冲突了

所以在定义类时重写了equals方法,应该保证当两个对象equals()返回true时,这两个对象的hashCode()返回值也相同

TreeSet:采用红黑树的数据结构来存放元素

TreeSet中的元素是按元素实际值的大小来排序的,TreeSet支持两种排序:自然排序和自定义排序,在默认情况下,采用自然排序

自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小,然后将元素按升序排列

自定义排序:可以以匿名类的方式重写compare(Object obj1,Object obj2)方法,重新定义比较规则

eg:

Comparator<String> c=new Comparator<String>(){

public int compare(String str1,String str2){

return str2.length()-str1.length();

}

};

0 0
原创粉丝点击