set集合

Set:元素是无序的(存入和取出的顺序不一定一致)。元素不可以重复
|--HashSet:底层数据结构是Hash表
HashSet是如何保证元素唯一性的?
是通过元素的两个方法,hashCode和equals来完成的
如果元素的hashCode值相同,才会判断equals是否为true
如果hashCode的值不同,不会调用equals方法
注意:对于判断元素是 否存在,以及删除等操作。依赖的方法是元素的hashCode和equals方法。
|--TreeSet 可以对set集合中的元素进行排序
底层数据结构是二叉树
保证元素唯一性的依据
compareTo方法return 0 ;
TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法
这中方式也称为元素的自然顺序,或者叫做默认顺序

set集合的功能和Collection是一致的。


Set集合的排序
我们知道,Set集合是无序的,
可以使用TreeSet类,那么TreeSet进行排序的规则是怎样的呢?
1 TreeSet支持两种排序方式,自然排序和定制排序,在默认情况下,TreeSet采用自然排序.
自然排序:
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合的元素按升序排列,这种方式就是自然排序.
为什么集合元素有compareTo方法,因为集合元素对象实现了Comparable接口,该方法返回一个整数值,当一个对象调用该方法与另一个对象进行比较,例如:
obj1.compareTo(obj2)如果返回0,表示这两个对象相等,如果该方法返回一个正整数,表示obj1大于obj2如果该方法返回一个负整数,表示obj1小于obj2
所以需要使用TreeSet集合进行自然排序,元素必须实现Comparable接口,但是Java一些常用的类已经实现了该接口,例如:String Character Boolean Date Time
BigDecimal BigInteger等
如:
TreeSet<String> ts = new TreeSet<String>();
ts.add("b");
ts.add("c");
ts.add("a");
System.out.println(ts);
结果:a b c


Set集合:(唯一)
1.特点:存入顺序和取出顺序不一致,不保证顺序不变,且元素唯一,底层由HashMap实现
2.HashSet    
底层为哈希表----HashMap---唯一
   HashSet为什么唯一呢?
  依赖hashCode和equals方法来判断两个元素是否一样,
  比如在判断时:hashCode值不一样---------->元素直接添加
 hashCode值一样------>在判断地址值和equals是否一样(两个有一个一样就ok)--->也一样---  ----->不添加
简单来说:hashCode不一样:直接添加
hashCode一样,equals不一样:直接添加
hashCode一样,equals也一样:不添加(此时说明是重复元素)
   说明:LinkedHashSet : HashSet的一个子类,可预知的迭代顺序,存储和取出顺序一致,数据结构由哈希表和链表实现,保证唯一性和有序性。
 
3.TreeSet
底层为TreeMap(红黑树)----唯一且能够根据某种排序规则进行排序,而比较是依赖于compareTo方法,方法在comparable接口内,需要排序的类要实现该接口。
排序:由构造方法来决定使用哪一种比较方法
(1)自然排序(元素具备):对象所属类实现了自然排序接口comparable,重写compareTo比较方法。
TreeSet()
(2)比较器排序(集合具备):
TreeSet(Comparator  comparator) , 构造里面传一个Comparator比较器接口的实现类
 
而在comparator对象的类实现了Comparator接口,也实现了比较的方法compare,传入两个待比较对象,写出比较逻辑,不过此处也可以不写Comparator的实现类,直接用匿名内部类来实现,重写比较方法compare即可。
 
     TreeSet存储自定义对象并保证排序和唯一,因为排序依赖于comparable接口内的compareTo方法,并且在底层调用的时候,会把自定义类转换为comparable类,(向上转型,多态),如果自定义的类没有实现该接口,则会报错。comparableException。compareTo返回0表示相等,大于0表示大于被比较对象。
原文地址:https://www.cnblogs.com/areyouready/p/7843921.html