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();
}
};