利用不重复的这个特点,我们可以用于查重
Set继承了Collection中的所有方法(同时继承了三种遍历方式:迭代器遍历、增强for遍历、Lambda表达式遍历)
1.HashSet(无序、不重复、无索引)(底层采用哈希表存储数据,哈希表是一种增删改查数据性能都较好的结构)
JDK8之前:数组+链表
JDK8开始:数组+链表+红黑树
哈希值:对象的整数表现形式(没有重写hashcode方法,不同的对象hashcode值不相同;重写了hashcode方法,不同的对象属性值相同,hashcode值相同)(如果参数是自定义类型时,需要重写hashCode和equals方法)
当数组中的数据超过0.75时,将会自动扩容,扩容到数组的两倍
当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树
问题一:HashSet为什么存和取的顺序不一样?
因为在JDk8以后,新元素直接挂在老元素后面,所以无法确定其中的数据是第几个存入的,因而存和取的顺序不一样。
问题二:HashSet为什么没有索引?
因为在JDK8以后,HashSet是由数组+链表+红黑树组合而成的,不好规定数据的索引。
问题三:HashSet是利用什么机制保证数据去重的?
利用HashCode方法和equals方法,利用equals判断哈希值。(用于自定义对象时)
2.LinkedHashSet(有序、不重复、无索引)(底层数据结构依然是哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序)
LinkedHashSet继承于HashSet,底层数据结构是哈希表和双向链表,因而我们存入数据和取出数据的顺序是一样的,即是有序的。
3.TreeSet(可排序、不重复、无索引)(底层数据结构是红黑数,不需要重写HashCode和equals)
由图我们知道TreeSet可以自动排序,那么TreeSet的排序规则是什么呢?
TreeSet的两种比较规则:
方式一:默认排序:Javabean类实现Comparable接口指定比较规则
默认使用第一种,如果第一种不能满足当前需求,就是用第二种
方式二:比较器排序,创建TreeSet对象的时候,传递比较器Comparator指定规则
Collection单列集合家族中常用的有5种,那么我们应该什么情况下用什么样的集合呢?