在我们创建HashMap对象的时候,底层会创建一个长度为16,默认加载因子为0.75的数组,我们在调用put方法添加数据的时候,底层会创建一个Entry对象,Entry对象里就是要添加的键值对,然后利用键计算哈希值(与值无关)。再计算出在数组当中应该存入的索引,如果索引位置为null,则直接添加,如果不是null,会调用equals方法比较键的属性值,如果属性值一样会直接覆盖原来的Entry对象,这也是put方法的底层原理。如果属性值不一样,会添加新的Entry对象,在JDK8以前,新的对象会添加到数组中,原来的元素会挂在新元素的下面形成链表,在JDk8以后,新的元素的挂在原有元素的下面形成链表,当链表长度>8并且数组长度>=64的时候会自动转成红黑树。
总结:
- HashMap底层是哈希表结构的(哈希表:数组+链表+红黑树)
- 依赖hashcode和equals方法保证了键的唯一
- 如果键存储的是自定义对象,需要重写hashcode和equals方法,如果值存储的是自定义对象则不需要重写。
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步