zoukankan      html  css  js  c++  java
  • HashMap中的equals和hashCode

    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()一定要相同,不然就有神奇的事情发生。

  • 相关阅读:
    C# Brush Color String 互相转换
    WPF Binding ElementName方式无效的解决方法--x:Reference绑定
    WPF动画应用-几何图形扩散动画
    Timer更新UI的合理办法
    员工管理
    EF CodeFirst 实例Demo
    C# 星期相关代码实例
    WPF Canvas实现进度条
    DispatcherTimer 应用实例
    数据库操作命令
  • 原文地址:https://www.cnblogs.com/faunjoe88/p/7992921.html
Copyright © 2011-2022 走看看