黑马程序员技术交流社区

标题: hashmap 中的Entry链问题5 [打印本页]

作者: android2050    时间: 2013-3-19 08:53
标题: hashmap 中的Entry链问题5
本帖最后由 陈团辉 于 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里有多个元素,该怎么理解?

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

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2