1. HashSet
无序、不重复、无索引
哈希值时对象的整数表现方法,存入哈希表的索引=(数组长度-1)& 哈希值
- HashSet集合的底层数据结构是什么样的?
是一个哈希表,而哈希表的底层数据结构是数组,在JDK8之前是数组+链表,在jdk8之后,是数组+链表+红黑树。
- HashSet添加元素的过程
首先是创建一个长度为16的空数组,当添加第一个元素的时候,会根据当前元素位置以及数组长度确定是否扩容,不扩容就看数组是否为空,为空就加入,若不为空,则使用equals()方法比较添加对象的属性与已经在该位置的元素的属性是否相同,相同就舍弃,添加失败,否则就挂在旧的数组元素下面。若链表个数大于8个,且数组元素大于64个,链表会自动转换成红黑树。
- HashSet为什么存和取的顺序不一样?
因为存是根据元素的索引index=(数组长度-1)& 哈希值 存的过程直接根据数组的索引存,而取元素需要遍历数组
- HashSet为什么没有索引?
因为HashSet不仅仅有数组,还有链表,红黑树,太复杂了
- HashSet是利用什么机制保证去重的?
hashcode()方法以及equals()方法,若对象的属性相同,就会舍弃对象
1.1 LinkedHashSet
添加第一个元素时候,在底层多了一个双向链表,链表的头节点就是添加的第一个元素
添加第二个元素的时候,第一个元素的内部会记录第二个元素的地址值,第二个元素也会记录第一个元素的地址值
遍历的时候就会从双向链表的头节点开始一直到尾节点
2. TreeSet
添加元素的时候,出现错误,因为TreeSet没有指定比较规则