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表示大于被比较对象。
那么: