HashMap 日常开发中用的最多的类,面试高频点。网上也有很多博客和视频做了比较透彻的解析。这里作者也是从一个小白的角度出发来解析这个类。
前面说到Object的时候,有说到hashcode是内存地址在hash表中的位置,而在hashmap中类中再次提到了hash表
hashmap定义基于哈希表的Map接口实现。翻译过来。是时候深入理解一波了hash表到底是什么?
任何技术产生都是有原因的。我们常用的数据结构数组
数组我们想插入一个新的元素时候,后面的元素必须腾出位置向后移动。但是查询的时候数组直接用索引就能找到元素。
在看看链表
单链表单链表数据结构一个 数据域一个指针域,这样的话插入就很方便了,但是查询就要一个个比较了从头到尾。
那试想一下结合两者的优点组合一下是什么。增删改查都是一步到位。
然后就有了下面的想法
来自百度百科哟西!这个就是hash表的大致结构了。hashmap按照此图实现没有问题了,都实现了,等等查询貌似有点问题?
比如这里我查找126 我先找到10节点 在找到26 最后在确认126节点,可以看到查询的时间复杂度还是 o(n)
当然java大佬也做了优化,jdk8之后加入红黑树(红黑树???为什么会选择这个??之后在安排专题)
针对于hash表还有一个问题,之前在object的equals方法说到过
两个对象不相等,其 hashCode 有可能相同,这样就会造成冲突,源码是怎么解决的(留个悬念)
好了数据结构大概清楚了 hashmap由数组+链表+红黑树组成
了解数据结构后,在了解一下基础概念
size
size表示HashMap中存放KV的数量(为链表和树中的KV的总和)。
capacity
capacity译为容量。capacity就是指HashMap中桶的数量。默认值为16。
loadFactor
loadFactor译为装载因子。装载因子用来衡量HashMap满的程度。loadFactor的默认值为0.75f。
threshold
threshold表示当HashMap的size大于threshold时会执行resize操作。
threshold=capacity*loadFactor
大概过一遍,等等看下源码就明白了。今天就先到这里~
参考博客
网友评论