HashMap

HashMap底层源码
静态内部类Node
当每次放值的时候就创建一个Node对象,放到相应的位置上。
有单独的Hashcode计算方法,与HashMap的Hash值计算方法不一样。(它是拿key值和value值共同计算的(key值的hashcode异或value值的hashcode),而hashmap只拿key值计算)
和单链表的节点类似,只有后继,没有前驱,但是存的值是key值和value值两个值。

HaspMap默认容量16,最大容量2的30次方,默认加载因子0.75倍,树结构 塌缩成链表最小转化成树的容量为64,
节点Node两个值(K、V),只有向后的值,当有值传进来,改变节点的Value,然后判断两个值是否相等:在内存里是否相等。
计算hash,用key。用来确定放在哪个位置。计算方法:如果key等于空,那么hash等于0,如果不等于0 ,就用自身和自身的逻辑右移进行异或(高位16位取反,低16位与高16位异或)。
底层用数组实现,数组里面有拉链,node的节点数组,名为table,HaspMap初始化,传进来两个值(初始化大小容量,加载因子),如果初始化大小小于0,抛异常,如果大于最大值,则等于最大值。加载因子小于0 抛异常,否则把加载因子(扩容)传进来,并且用tableSizeFor方法计算转化因子(树化)。
tableSizeFor方法(求出转换因子):传进来一个值,令n等于传进来的值-1,则返回(n<0)?1:(n>=MAXIMUN_CAPACITY)?MAXIMUN_CAPACITY:n+1。
put方法:传入key,value,返回putval方法中的key的hsah值、key、value、false、true。
putval方法:传入key的hsah值、key、value、是否缺席、是否已经有值。创建节点数组tab、节点p,定义整数n、i;如果tab(table)为空或者n(table长度)为0,则n等于新数组(tab=resize)的长度。如果(把tab的第(i=(n-1)&hash)的值赋给p)为空,则新建节点tab[i],如果这个位置没有值,则放到这个地方,如果有值,则往下加链表;如果先加size大于老的转化因子,就调用resize;然后调用after Node Insertion(true);。
resize()方法:定义node节点数组oldTab为table,定义原来容量oldCap=(oldTab==null)?0:oldtab.length;定义老转化因子oldthr=threshold;定义新大小新转化因子为0;如果老的大小小于0;则新容量等于老转换因子,如果等于0,则新容量等于默认容量16;新转化因为等于加载因子乘默认容量等于12。。如果新转化因子不等于0 ;创建一个大小为新容量(16)的数组,返回新数组

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值