HashMap的存储方式

HashMap的实现方式是数组链,不同的对象根据其哈希码(hashCode方法的返回值)找到对应的数组下标,然后存入数组。不同的对象有相同的哈希码时怎么办?这就由数组链中的链来解决了,相同哈希码的对象都放在同一条链上,该链的链头指向数组,进而形成数组链。

当第一个对象已经存入HashMap,第二个对象准备存入HashMap时,系统在查找到数组下标后若发现它们的hashCode相同(也就是冲突),会调用equals()来检查它们之间的关系,会有相应有以下两种处理方法:
1. 如果相等,系统就不再存入第二个对象;
2. 如果不等,系统视它们为纯粹的下标冲突,将它们放在同一条链上;

如果它们的hashCode不相同,直接存入第二个对象。

equals()匹配但hashCode()不同

现在假设有两个对象,它们的equals()相匹配,但hashCode()却不同,让我们好好分析一下当它们存入HashMap时会发生什么。

假设StringA和StringB是两个不同的对象,内容都是”hello,world”,equals()返回true,但hashCode()返回值不一样。我们把StringA和StringB当作Key,分别对应着ValueA和ValueB。

在StringA和ValueA已经存入HashMap后,我们尝试存入StringB和ValueB,因为hashCode不同,StringB和ValueB顺利地进入HashMap.

我们写一个查询:HashMap.get(“hello,world”),此时会发生什么呢?我们取回的究竟是ValueA还是ValueB?只有天知道。

或者换一下,我们写一个查询:HashMap.get(StringA),此时会发生什么呢?我们取回的究竟是ValueA还是ValueB?只有天知道。

再换一下,我们写一个查询:HashMap.get(StringB),此时会发生什么呢?我们取回的究竟是ValueA还是ValueB?只有天知道。

相信聪明的你已经看出了问题所在。所以我们常说,如果equals匹配,hashCode()一定要相同,不然就有神奇的事情发生。

HashMap中的equals和hashCode的更多相关文章

  1. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  2. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

  3. Java中的equals和hashCode方法详解

    Java中的equals和hashCode方法详解  转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...

  4. 转:Java中的equals和hashCode方法详解

    转自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这 ...

  5. Java中的equals()和hashCode() - 超详细篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的equals()和hashCode() - 详细篇>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻烦在评论 ...

  6. 【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

    原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http ...

  7. java集合(3)- Java中的equals和hashCode方法详解

    参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

  8. Java Object中的equals和hashCode

    Java的Object对象中有两个方法比较有意思,一个是equals(),一个是hashCode(),那么这两个的作用有些同学可能还不是很清楚,那么同学们现在就进一步了解一下吧. 下面咱们写一个简单的 ...

  9. Java基础:Object类中的equals与hashCode方法

    前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象   对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...

随机推荐

  1. 剑指offer第3题:从尾到头打印链表

    方法一:采用栈来存储,用ArrayList保存.注意题目给出的输出结果是ArrayList import java.util.ArrayList; import java.util.Stack; pu ...

  2. (转)如何在Linux中统计一个进程的线程数

    如何在Linux中统计一个进程的线程数 原文:http://os.51cto.com/art/201509/491728.htm 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会 ...

  3. 生产者与消费者模式-阻塞 wait,notify

    设计思路:生产者push ,消费者 拿,篮子装,syncstack先进后出,while 判断 index=0 wait,      当 Producer生产了 并push到篮子里  notify(唤醒 ...

  4. org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.

    今天报了这个异常,这是页面报的 org.springframework.dao.DataIntegrityViolationException: could not execute statement ...

  5. 读书笔记-NIO的工作方式

    读书笔记-NIO的工作方式 1.BIO是阻塞IO,一旦阻塞线程将失去对CPU的使用权,当前的网络IO有一些解决办法:1)一个客户端对应一个处理线程:2)采用线程池.但也会出问题. 2.NIO的关键类C ...

  6. Python编码规范杂记(很乱:))

    Python编码规范 导入模块 每一个(第三方)模块的导入都需要两个import语句, 如下 使用import some的方式导入模块, 如果有还有子模块的话, 则from father.son im ...

  7. [转]v$parameter, v$parameter2, v$system_parameter, v$system_parameter2, v$spparameter区别

    本文转自:http://blog.csdn.net/huang_xw/article/details/617389 1 v$parameter v$parameter显示的是session级的参数. ...

  8. .net比较两个时间的大小,不含日期,精确到分

    解决方案: 1.将要比较的两个时间转成DateTime类型: DateTime date1 = DateTime.Parse("8:00"); DateTime date2 = D ...

  9. 静态化HttpClient

    实现方法: public class HttpClientHelper { private static HttpClient _client; public static HttpClient Ge ...

  10. C# 用tabcontrol实现窗体类似网页排版的显示

    这里做的比较简陋,可以美化下 把form设置为非顶级控件,直接放在tabcontrol里边,然后实现tabcontrol的拖拽移除tabpage显示form以及添加tabpage mousemove的 ...