HashMap之微代码解析-总结整理
HashMap之微代码解析-总结整理
指尖Coding 发表于1年前
HashMap之微代码解析-总结整理
  • 发表于 1年前
  • 阅读 6
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

1.HashMap继承AbstractMap类,实现Map接口。key和value都允许为null,非线程安全。

2.HashMap底层是使用数组和链表实现的,当new一个HashMap的时候,jvm就会初初始化一个数组。

3.HashMap的put方法是,现根据key计算hashcode,根据hashcode计算该元素在数组中的位置,数组的内容是一个链表(链表有next节点)。

4.哈系运算会有重复的哈希值,对于哈希值的冲突,HashMap采用链表(挂链)来解决的。

数组存储的是链表,链表是为了解决哈希冲突的。

/**
* next就是为了哈希冲突而存在的。比如通过哈希运算,一个新元素应该在数组的第10个位置,
* 但是第10个位置已经有Entry,那么好吧,将新加的元素也放到第10个位置,将第10个位置的
* 原有Entry赋值给当前新加的 Entry的next属性。数组存储的是链表,链表是为了解决哈希冲突的。
*
*/
static class Entry<K,V> implements Map.Entry<K,V> {    
     final K key;    
     V value;    
     Entry<K,V> next;    
     int hash;    
}    

5.当两个对象的hashcode相同会发生什么?

因为hashcode相同,所以它们的存储数组位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。

6.如果两个键的hashcode相同,你如何获取值对象?

根据hashcode找到数组位置,然后遍历LinkedList直到找到值对象,HashMap在链表LinkedList中存储的是键值对。

 

 

 

 

 

共有 人打赏支持
粉丝 2
博文 50
码字总数 36954
×
指尖Coding
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: