HashSet 和LinkHashSet 底层原理

       

一  、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的地址,以此类推。对哈希表进行便遍历的时候,会从头结点开始进行遍历,然后按照双向链表的方向依次遍历;

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tinkinon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值