HashMap
HashMap是基于哈希表的Map接口实现,是非线程安全的。
JDK1.8之前 HashMap 底层是数组+链表实现的,数组是HashMap的主题,链表则是为了解决哈希冲突的。(拉链法)
JDK1.8之后 HashMap 在解决哈希冲突的方法有了较大的变化,当链表长度大于等于8并且数组长度大于等于64后,会将链表转化为红黑树,以减少搜索时间。
说一下HashMap的实现原理
HashMap的数据结构是数组+链表(JDK 1.7及之前) or 链表&红黑树(JDK 1.8之后)
- 我们往HashMap里put元素时,利用key的哈希值(hashcode()算出来的)重新hash计算出当前元素在数组中的下标。
- 若key相同则覆盖
- 若key不同则存入链表或红黑树中
获取数据时,计算key的hash值得到对应的下标,如果里面有多个Entry的话,我们需要进一步遍历这些 Entry 来找到与给定 key 相匹配的 Entry,从而找到对应值。