A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© android2050 中级黑马   /  2013-3-19 08:53  /  1956 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈团辉 于 2013-3-20 08:44 编辑

hashmap 中的Entry链问题
   引用网上的一段话:
当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部

我的疑问是,这段话要怎么理解
因为当我定义

Java代码:
  1. 1.map.put(1,"a");   
  2. 2.map.put(1,"b");  
  3. map.put(1,"a");
  4. map.put(1,"b");


复制代码
此时map的size实际是1,map.get(1)为b也就是说后put的元素把前面的覆盖了。
所以我想知道的是这个Entry里有多个元素,该怎么理解?

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

1 个回复

倒序浏览
你如果知道了解Map底层源码,就很容易明白了:
Map集合不管你是去添加,删除,查询都要先去计算你的键的hash值,它的底层容器,你可以理解成一个数组,在向容器中添加元素的时候,可以通过计算hash值,来确定这个元素的脚标,算出脚标之后,就去判断该脚标处是否已经有值。
如果没有值,就将这个键存在这个脚标处,并将其值的索引指向这个键。
如果该脚标处已经有一个键,就说明键相同,再判断值是否相等,如果值相等,就复盖。如果值不相等,就从该脚标处拉一链出去(链表)。但是这个链每次添加都是从头部添加。也就是后来了的再链的前面,开如前面的向后移。

你上面的那个Entry里只有两个元素,第一个a被第二个a复盖了,第一个b被第二个b复盖了a,b 再同一个支链上,b头部,a在b后面。.

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马