一 、HashSet的底层原理
HashSet在底层使用哈希表(增删改查性能好的一种数据结构)进行数据存储,其存在方式是由数组,链表,红黑树构成
首先创建一个h对象:
HashSet <String> h=new HashSet;
此时在底层就会创建一个长度为16的一个数组(数组属性为null,数组长度可以增加,但默认初始化为16);
之后添加数据时,会根据哈希值和数组的长度计算出此数据存储在哈希表的位置,即
在哈希表中的位置==(数组长度-1)&哈希值
(哈希值是根据hashCode方法所计算出的,如果不重写此方法,那么哈希值的计算是根据对象的地址值进行计算,所以不同的对象的哈希值可能不同,但是如果重写了hashCode方法,那么就会根据对象内部的属性值进行计算)
然后对数据所要存储到的位置的内容进行判断,如果此位置的属性值为null,那么就将此数据存储到此位置;
如果此位置的属性值不是null,那么说明此位置已经有数据存储,此时使用equal()方法判断属性值是否相同,若相同,则不存储,若不同,那么会在这个位置创建链表,将新的数据挂在老数据下面(不是把老数据替换);
当数组存储的长度达到12时,就会触发哈希表的加载性质,将自己的长度扩大两倍以存储更多的数据,或者当链表长度大于8且数组长度大于64时,此链表就会自动转化为红黑树;
如下图所示:
二、LinkHashSet 底层原理:
大体上和HashSet是相同的,只不过LinkHashSet可以保证存储和去除的顺序保持一致,其原理是在录入数据的时候,会创建一个双向链表,提供指示的功能;
例如要存储数据1,3,5,4;首先将1录入,在录入3的时候,会在数据1中存储数据3的地址,数据3也会存储数据1的地址,在存储5时,数据3也存储数据5的地址,5也会存储3的地址,以此类推。对哈希表进行便遍历的时候,会从头结点开始进行遍历,然后按照双向链表的方向依次遍历;