HashMap的源码分析

  • Node类

Node类,此类实现Map.Entry接口,此类对Key,Value的封装,同时也是一个单向链表。

  • Node类中包含的属性有:

  • hash:哈希值

  • key:键

  • value:值

  • next:下一个结点的引用

  • 属性:

  • size:元素个数

  • loadfactor:加载因子,默认为0.75,(元素个数/数组长度)超过这个值时,将会扩容

  • table:内部用来存储键值对(Node)的数组。

  • 构造方法:

  • 构造方法的作用就是记录一下16这个数给threshold(这个数值最终会当作第一次数组的长度。),和初始化加载因子。注意,hashMap中table数组一开始就已经是个没有长度的数组了。

  • ():初始长度为16,加载因子是0.75;

  • (int ):指定初始长度,建议为2的次方

  • (int,double)指定初始长度和加载因子

  • (map)有初始值:

  • 方法:

  • put(key,value)

  • 1重新计算hash值

  • 2判断是否扩容,并完成扩容

  • 3计算存储位置:(table.length-1)&hash==hash%table.length;

  • 4.存储新元素需要进行判断:
    如果此位置没有元素,直接存到此位置。
    如果此位置的key与新key相等,替换
    如果不相等,则遍历单向链表
    hashMap的重点:

  1. hashMap存放元素的过程:
    通过key,value封装成一个entry对象,然后通过key的值计算entry的hash值,接着通过entry的hash值和数组的长度计算出entry放在数组的那个位置,每次存放都将entry存放在第一个位置。
  2. loadFactor加载因子为什么是0.75的原因:
     loadFactor加载因子是控制数组存放数据的疏密程度,loadFactor越趋近于1,那么数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,loadFactor越小,也就是趋近于0,那么数组中存放的数据也就越稀,也就是可能数组中每个位置上就放一个元素。那有人说,就把loadFactor变为1最好吗,存的数据很多,但是这样会有一个问题,就是我们在通过key拿到我们的value时,是先通过key的hashcode值,找到对应数组中的位置,如果该位置中有很多元素,则需要通过equals来依次比较链表中的元素,拿到我们的value值,这样花费的性能就很高,如果能让数组上的每个位置尽量只有一个元素最好,我们就能直接得到value值了,所以有人又会说,那把loadFactor变得很小不就好了,但是如果变得太小,在数组中的位置就会太稀,也就是分散的太开,浪费很多空间,这样也不好,所以在hashMap中loadFactor的初始值就是0.75,一般情况下不需要更改它。
    3.桶的概念:
    数组中每一个位置上都放有一个桶,每个桶里就是装一个链表,链表中可以有很多个元素(entry),这就是桶的意思。也就相当于把元素都放在桶中。
    4.capacity
     这个就代表的数组的容量,也就是数组的长度,同时也是HashMap中桶的个数。默认值是16.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值