HashSet集合概述和特点

1.底层数据结构是哈希表

2.不能保证存储和取出的顺序完全一致

3.没有带索引的方法,所以不能使用普通for循环遍历

4.由于是Set集合 所以元素唯一

哈希值(哈希码值)

是JDK根据对象的地址或者属性值,算出来的int类型的整数

Object 类中有一个方法可以获取对象的哈希值

public int hashCode():根据对象的地址值算出来的哈希值

对象的哈希值特点

1.如果没有重写hashCode方法,那么是根据对象的地址值计算出的哈希值。

同一个对象多次调用hashCode()方法返回的哈希值是相同的

2.如果重写了 hashCode方法,一般都是通过对象的属性值计算出哈希值

如果不同对象属性值一样,那么计算出来的哈希值也是一样的

如果HashSet 集合要存储自定义对象。一定要在类里重写equals 跟 hashCode方法,避免输入的数据重复

常见数据结构之哈希表

JDK8 之前 底层采用数组+链表实现

JDK8以后 底层进行了优化 由数组+链表+红黑树实现

HashSet1.7 版本原理解析 

HashSet<String> hm = new HashSet<>();

1.创建一个默认长度16,默认加载因为0.75(当数组里存了16*0.75=12个元素的时候,数组会扩容成原来的两倍)的数组 ,数组名table

2.添加元素时首先计算元素的哈希值,根据哈希值判断该在哪里存入元素

3.判断当前位置是否为null,如果是null直接存入

4.如果应存入的位置不是null,表示有元素,则调用equals方法比较属性值

5.如果一样,则不存,如果不一样则存入数组,老元素挂在新元素下面。形成链表

HRESULT获取 hashset获取值_属性值

HashSet1.8版本原理解析 

底层:哈希表 (数组链表红黑树结合)

当挂在下面的元素过多,不利于添加,也不利于查询

当链表长度超过8的时候,会将链表转换为红黑树

存储流程:计算哈希值——计算应存入的索引——判断是否为空,为空直接存,不为空则根据是链表还是红黑树,用equals方法比较属性值然后判断存入位置

Set集合小结  

Set 特点 无需无索引不可重复

 

HRESULT获取 hashset获取值_数据结构_02