Set:表示无序(存入和取出)不可重复集合,可以保存null元素
接口下:HashSet、TreeSet、LinkedHashSet
================================================================
HashSet:基于HashMap,底层是键值对+链表+红黑树(jdk1.8之后)
初始长度:16,负载因子:0.75
判断重复的机制:hashcode()—>equals()
- 先判断元素的hashCode值
- 在hashCode相等的情况下,继续判断equals比较,如果都相等认为是同一个元素
==============================================================
LinkedHashSet:是一个有序的HashSet,在HashSet基础上维护了一个链表
==============================================================
TreeSet:基于TreeMap,TreeMap底层基于红黑树(是特殊的二叉树,左边叉值小,右边叉值大,有自平衡机制)
-
自然排序:元素类型必须实现了Comparable接口,且必须重写compareTo()方法
返回值 正数:升序
返回值 负数:降序
返回值0:相同的元素,就不会添加了 -
定制排序:在创建TreeSet对象的时候,传入一个Comparator接口的实现类,该实现类必须重写compare方法
返回值 正数:升序
返回值 负数:降序
返回值 0:相同的元素
注意事项:
1、当自然排序和定制排序同时使用,定制排序优先级更高
2、一般情况下,默认排序用自然排序,特殊排序用定制排序
==========================================================
因为Set是无序、无下标,所以只有foreach和单向迭代器这两种遍历方式
//1、foreach
for (Object object : hashSet) {
System.out.println(object);
}
//单向迭代器
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()) {
Object object = (Object) iterator.next();
System.out.println(object);
}