Java高级Day23-HashMap

74.HashMap

  1. Map接口常用实现类:HashMap、Hashtable和Properties

  2. HashMap是Map接口使用频率最高的实现类

  3. HashMap是以key-value对的方式来存储数据

  4. key不能重复,但是值可以重复,允许使用null健和null值

  5. 如果添加相同的key,会覆盖原来的key

  6. 与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的

  7. HashMap没有实现同步,因此线程是不安全的,方法没有做同步互斥的操作,没有synchronized

HashMap底层扩容机制:

  1. HashMap底层维护了Nod类型的数组table,默认为null

  2. 当创建对象时,将加载因子(loadfactor)初始化为0.75

  3. 当添加key-val时,通过key的哈希值得到在table的索引。然后判断该索引处是否有元素,如果没有元素直接添加。如果该索引处有元素,继续判断该元素的key是否和准入加入的key相等,如果相等,直接替换val;如果不相等需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不够,需要扩容

  4. 第1次添加,则需要扩容table容量为16,临界值为12

  5. 以后再扩容,则需要扩容table为原来的2倍,临界值为原来的2倍,既24,以此类推

模拟HashMap触发扩容,树化情况

复制代码
public class HelloJava {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        for (int i = 1;i <= 12;i++){
            hashMap.put(new A(i),"hello");
        }
        hashMap.put("aaa","bbb");
        System.out.println("hashMap=" + hashMap);
    }
}
​
class A{
    private int num;
​
    public A(int num) {
        this.num = num;
    }
    //所有的A对象的HashCode都是100
    @Override
    public int hashCode() {
        return 100;
    }
​
    @Override
    public String toString() {
        return "A{" +
                "num=" + num +
                '}';
    }
}
相关推荐
lUie INGA4 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端
小糖学代码4 小时前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc
handler015 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
geBR OTTE5 小时前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
Porunarufu5 小时前
博客系统UI自动化测试报告
java
小白学大数据5 小时前
现代Python爬虫开发范式:基于Asyncio的高可用架构实战
开发语言·爬虫·python·架构
渔舟小调5 小时前
P19 | 前端加密通信层 pikachuNetwork.js 完整实现
开发语言·前端·javascript
不爱吃炸鸡柳5 小时前
数据结构精讲:树 → 二叉树 → 堆 从入门到实战
开发语言·数据结构
网络安全许木5 小时前
自学渗透测试第21天(基础命令复盘与DVWA熟悉)
开发语言·网络安全·渗透测试·php
t***5445 小时前
如何在Dev-C++中使用Clang编译器
开发语言·c++