目录
Set集合:
- 1、无序,不可重复,没有索引,取出的顺序和添加的顺序不一样,但是他是固定的。
- 2、和List接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样。
- 3、可以使用迭代器和增强for遍历,不能使用索引的方式。
SortedSet集合存储元素特点:
- 首先是无序不可重复的,但是SortedSet集合中的元素是可排序的。
- 无序:存进去的顺序和取出的顺序不一定相同。另外Set集合中元素没有下标。
- 不可重复:存进去1,不能在存储1了。
- 可排序:可以按照大小顺序排列。
HashSet集合的特点:
- HashSet实际上是HashMap
- HashSet底层是HashMap。HashMap底层是数组+单向链表+红黑树
- 分析HashSet的添加元素底层是如何实现(hash() + equals() )
- 1、先获取元素的哈希值(hash()方法),对哈希值进行运算,得到一个索引值,就是存在哈希表中的位置号
- 2、找到存储数据表table,看这个索引位置是否已经存放元素
- 3、如果没有,直接加入
- 4、如果有,调用equals比较,如果相同就放弃添加,如果不相同,则添加到最后
- 5、在jdk8中,如果一条链表的元素个数到达8个,table的大小到达64个,就会进行树化(红黑树)
- 分析HashSet的扩容和转成红黑树机制
- 1、HashSet底层是HashMap,第一次添加时,table数组扩容到16,临界值是 是 16 * 加载因子是0.75 = 12
- 2、如果table数组使用到了临界值12,就会扩容到 16 << 1 = 32 ,新的临界值就是 32 * 0.75 = 24 以此类推
- 3、表里面全部的数据到达了临界值就会扩容,而不是只看某一个链表
- 4、在jdk8中,如果一条链表的元素个数到达 8 并且table的大小 >= 64 就会进行树化(红黑树) ,否则仍然采用数组扩容机制
LinkedHashSet集合的特点:
- 1、LinkedHashSet是HashSet的子类
- 2、LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表
- 3、LInkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的
- 4、LinkedHashSet不允许添加重复元素
TreeSet集合的特点:
- 1、TreeSet集合底层实际上是一个TreeMap。
- 2、TreeMap集合底层是一个二叉树。
- 3、放到TreeSet集合中的元素,等同于放到TreeMap集合key部分了。
- 4、TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序。称为:可排序集合。
- 5、对于自定义的类型来说,TreeSet可以排序吗?
- 不能,会出现异常。
- 出现异常的原因是,这个类没有实现Comparable接口和重写compareTo方法