Java集合框架(四),linux视频教程

本文详细探讨了Java HashMap的内部结构,包括静态内部类SimpleEntry和SimpleImmutableEntry的区别,以及HashMap的构造方法、常量、变量。重点分析了put方法的流程,包括inflateTable方法的原理,以及添加Key不为null元素时如何处理冲突和扩容。文章还揭示了HashMap在扩容时如何避免哈希冲突,并解释了为何容量必须为2的幂次方。
摘要由CSDN通过智能技术生成

在这里插入图片描述

这个抽象类也是默认实现了一些Map接口里面的方法,同时有两个静态内部类实现了Entry接口

在这里插入图片描述

这两个静态内部类的不同之处就在于,SimpleEntry实现了setValue方法(这个方法用来修改当前节点的value),而SimpleImmutableEntry没有实现setValue方法,单纯只是抛出了一个UnSupport异常出来

在这里插入图片描述

注释的意思就是,使用这个节点会不支持改变值,那么就可以保证线程安全,线程不安全可能是因为获取的那个oldValue会丢失掉上一个线程的修改,即A、B两个线程同时setValue,因为同时进入,还没修改,拿的oldValue都是一样的,但假设A先执行完setValue,那么B应该获取的oldValue是A修改的值才对

SimpleEntry的setValue方法

在这里插入图片描述

SimpleImmutableEntry的setValue方法

![还有一个区别就是

对于K,V属性,两者的修饰是不一样的

SimpleEntry的key是不可变的,而value是可变的

在这里插入图片描述

而SimpleImmuntableEntry的key和value都是不可变的

在这里插入图片描述

Jdk1.7的HashMap


接下来我们就进入HashMap吧

在这里插入图片描述

HashMap继承了AbstractMap和实现了Map(与前面的ArrayList一样,都出现了多余的操作,即AbstractMap已经实现了Map,后面实现Map就多余了)

JDK1.7的HashMap,估计都知道底层是数组加链表

常量和变量

在这里插入图片描述

可以看到,HashMap拥有的变量和常量还挺多

逐个逐个来看

ALTERNATIVE_HASHING_THRESHOLD_DEFAULT

在这里插入图片描述

从注释上可以看出,这个静态常量是当使用字符串来代替hashcode的时候,HashMap默认的阈值,当size(HashMap里面元素个数)超过这个阈值就要进行扩容

而且可以看到,这个扩容条件是元素个数大于Integer的最大值

这样设置可能是因为hashcode是一个整形,所以当超出整形的范围才会使用字符串来代替hashcode,所以扩容条件也是大于Integer的最大值

DEFAULT_INITIAL_CAPACITY

在这里插入图片描述

这个静态变量是HashMap底层主数组的容量,默认值是 2 4 2^4 24,也就是16,而且注释上还有一个很重要的信息,即默认的容量必须是2的幂次方,至于为什么,后面再进行解释

DEFAULT_LOAD_FACTOR

在这里插入图片描述

这个就是负载因为,当数组的使用率超过这个负载因子时就要进行扩容,默认是

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值