背景
工作中最常用的数据结构应该就是Map了,记录你在学习中可能会遇到的问题。不系统介绍hashmap的结构、原理,以及put、resize、get、树化等过程。
常见问题
HashMap的原理,相关类图?
key的hash值决定在数组中的index,如果hash值相同,则以链表形式存储,链表非常大以后会改变成红黑树数据结构,目的是提高检索的性能,工作中使用场景不多。
put过程中,index位置如何计算?resize后index位置是否发生改变?
index计算如下,不同版本区别较大。
i = (n - 1) & hash
[index = hash & (tab.length - 1)]
hash表的Node不是key本身的hash,而是单独的key,相关源码如下
public V put(K key, V value) { return putVal(hash(key), key, value, false, true);}
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
resize方法是hashmap中非常重要的方法,根据当前容量、负载因子、树化,根据index的计算可以发现,resize后,会copy老数据到新的数据,位置使用新的算法,发生改变。
什么时候发生树化?
如果容量大于 MIN_TREEIFY_CAPACITY ,则开始,模式值是64.
hash碰撞是什么,如何处理?
不同的输入,计算相同的hash值,在java的hashmap中,put过程中只要index一样就可能产生碰撞。