Java集合框架--Set

99 阅读2分钟

image.png

image.png

1. HashSet

无序、不重复、无索引

image.png

哈希值时对象的整数表现方法,存入哈希表的索引=(数组长度-1)& 哈希值

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

  1. HashSet集合的底层数据结构是什么样的?

是一个哈希表,而哈希表的底层数据结构是数组,在JDK8之前是数组+链表,在jdk8之后,是数组+链表+红黑树。

  1. HashSet添加元素的过程

首先是创建一个长度为16的空数组,当添加第一个元素的时候,会根据当前元素位置以及数组长度确定是否扩容,不扩容就看数组是否为空,为空就加入,若不为空,则使用equals()方法比较添加对象的属性与已经在该位置的元素的属性是否相同,相同就舍弃,添加失败,否则就挂在旧的数组元素下面。若链表个数大于8个,且数组元素大于64个,链表会自动转换成红黑树。

  1. HashSet为什么存和取的顺序不一样?

因为存是根据元素的索引index=(数组长度-1)& 哈希值 存的过程直接根据数组的索引存,而取元素需要遍历数组

  1. HashSet为什么没有索引?

因为HashSet不仅仅有数组,还有链表,红黑树,太复杂了

  1. HashSet是利用什么机制保证去重的?

hashcode()方法以及equals()方法,若对象的属性相同,就会舍弃对象

1.1 LinkedHashSet

image.png

image.png

image.png

添加第一个元素时候,在底层多了一个双向链表,链表的头节点就是添加的第一个元素

image.png

image.png

添加第二个元素的时候,第一个元素的内部会记录第二个元素的地址值,第二个元素也会记录第一个元素的地址值

image.png

image.png

遍历的时候就会从双向链表的头节点开始一直到尾节点

image.png

2. TreeSet

image.png

image.png

image.png

image.png

添加元素的时候,出现错误,因为TreeSet没有指定比较规则

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png