一、简单用文字来叙述HashMap实现原理
- HashMap是采用Hash表的结构,通过拉链法和再哈希法来处理hash冲突的。
- HashMap里面实现了一个静态内部类Entry,它有4个参数hash、key、value和next。HashMap实际上就是一个entry数组。
- 首先,我们通过key.hashCode()来获得key的hashcode,并与entry数组的长度取模得到该key-value所组成的entryX所在的下标index。
- 接着,我们判断该index下的链表中是否已经存在该key。若存在,则将其value值进行替换;若不存在,则将该entryX放置在该index,并使其next指向原entry对象。
- 如果遇到null键,将其放置在该数组的第一位,做法同上。
- 如果该数组中的容量超过默认容量时,则扩大表容量为旧表的2倍(最大值为Integer,MAX_VALUE),同时将旧表的内容映射到新表中(再哈希法)。
- JDK7用的是链表,JDK8在数据长度达到某个阙值的时候,转而用红黑树来存储。