如果我覆盖类的任一方法,它必须确保如果A.equals(B)= true则(A.hashCode()== B.hashCode)也必须为true.

有人能告诉我一个简单的例子,如果这被违反,会导致问题吗?我认为如果你使用该类作为Hashmap的键类型,它有什么关系?

解决方法

当然:
public class Test {
  private final int m,n;

  public Test(int m,int n) {
    this.m = m;
    this.n = n;
  }

  public int hashCode() { return n * m; }

  public boolean equals(Object ob) {
    if (ob.getClass() != Test.class) return false;
    Test other = (Test)ob;
    return m == other.m;
  }
}

有:

Set<Test> set = new HashSet<Test>();
set.put(new Test(3,4));
boolean b = set.contains(new Test(3,10)); // false

从技术上讲,这应该是真的,因为在这两种情况下m == 3.

通常,HashMap的工作方式如下:它具有可变数量的通常称为“桶”的东西.存储桶的数量可以随时间变化(添加和删除条目时),但它总是2的幂.

假设给定的HashMap有16个桶.当您调用put()添加条目时,将计算密钥的hashCode(),然后根据存储区的大小获取掩码.如果您(按位)和hashCode()与15(0x0F),您将获得最后4位,等于0到15之间的数字(包括0和15):

int factor = 4;
int buckets = 1 << (factor-1) - 1; // 16
int mask = buckets - 1; // 15
int code = key.hashCode();
int dest = code & mask; // a number from 0 to 15 inclusive

现在,如果该桶中已有条目,则会出现所谓的碰撞.有多种方法可以解决这个问题,但HashMap使用的方法(可能是最常见的)是bucketing.具有相同掩码hashCode的所有条目都放在某种列表中.

因此,要查找给定键是否已在地图中:

>计算屏蔽的哈希码;
>找到合适的水桶;
>如果它是空的,则找不到钥匙;
>如果is不为空​​,则遍历存储桶中的所有条目,检查equals().

查看存储桶是一个线性(O(n))操作,但它只是一个小子集.哈希码桶确定基本上是常数(O(1)).如果存储桶足够小,则通常将对HashMap的访问描述为“接近O(1)”.

你可以对此做一些观察.

首先,如果你有一堆对象都返回42作为他们的哈希码,HashMap仍然会工作,但它将作为一个昂贵的列表运行.访问将是O(n)(因为无论桶的数量如何,所有内容都将在同一个桶中).实际上我在接受采访时被问过这个问题.

其次,回到原点,如果两个对象相等(意思是a.equals(b)== b.equals(a)== true)但是有不同的哈希码,那么HashMap会查找(可能)错误存储桶导致不可预测和未定义的行为.

在Java中,为什么equals()和hashCode()必须一致?的更多相关文章

  1. ios – 如何在RubyMotion中创建字符串的md5哈希

    我有一封电子邮件,想从gravatar.com中提取相应的图片使用ruby,很容易:由于RubyMotion中没有require方法,如何从电子邮件生成哈希?解决方法一种可能性是使用“NSDataMD5”cocoapod.通过将其添加到您的Rakefile来安装它:然后你可以像这样使用它:

  2. Swift- 枚举中的rawValue和hashValue

    成员值仅仅是一组抽象的符号,不能参与任何运算,也不代表任何数据类型!4)原始值的推断:在Swift中只有Int型的原始值可以推断,其余类型包括Double、String、Character类型都无法在原始值中推断;这里的推断是指不用给出所有成员值的原始值而只需要给定一部分即可,其余的原始值Swift可以自动推断出,但是这里就只有Int类型的支持原始值推断,而推断的方法和C语言的枚举类型一样:enumWeekDays:Int{

  3. Swift开篇004-&gt;集合

    如有错误和疑问,欢迎指正提出。

  4. 什么是Swift中的Java HashMap

    我有一个用Java编写的示例,我想将其转换为Swift.下面是代码的一部分.如果你能提供帮助我真的很感激.注意:entrySet()是java.util.Map接口的方法,而getValue()是java.util.Map.Entry接口的方法.我相信你可以使用字典.这里有两种方法可以完成字典部分.或尝试使用类型推断至于for循环

  5. android – 会话提供给未打开状态的请求

    FacebookSDK3.0中的Facebook好友选取器示例显示错误拨号框.消息框说:‘com.facebook.Facebook异常:为未打开状态的请求提供的会话.解决方法我有这个确切的错误,如果你从Eclipse运行它,那么logcat中很可能会有更详细的错误.对我来说,我发现真正的错误是我的Android哈希键与我提供给Facebook的哈希键不匹配.仔细检查您使用的哈希键是否正确.请参阅

  6. 有关适用于Android的Facebook SDK的开发和发布密钥哈希的问题

    如你所知,android使用不同的Keystore进行开发和发布,因为两个密钥库在每个方面都不同,它们都有不同的指纹和SHA-1哈希,因此它们被完全区别对待.问:如果我尚未将我的应用程序发布到PlayStore.我可以使用ReleaseKey而不是使用Development键吗?如果你担心Facebook密钥,附加是图像问:为什么我们为iOS开发时,不需要那些关键的哈希?

  7. android – AutoCompleteTextView使用HashMap onItemClick项目位置或id

    我是Android开发新手,遇到了一个我很难解决的问题.我试图弄清楚如何正确使用AutoCompleteTextView小部件.我想使用来自Web服务的XML数据创建AutoCompleteTextView.我设法让它工作,但我对输出肯定不满意.我想放一个id=>的HashMap;将名称对配入AutoCompleteTextView并获取所单击项目的ID.当我点击自动完成过滤集输出时,我想填充自动

  8. android – 如何将唯一的GCM注册标识存储到MySQL中

    我正在设置GoogleCloudMessaging机制的服务器端,使用MySQL存储移动应用提供的注册ID.Google可以发出最多4k个注册码,我被迫将其存储在TEXT字段中.所有的好,到目前为止,问题是我必须处理这样的情况:>用户登录到应用程序>该应用从google请求注册ID>应用程序将新的注册ID发送到应用服务器>服务器存储该注册ID并将其链接到当前登录的用户>该用户注销并且新用户登录>应

  9. Android:为文件名创建唯一的字符串

    我正在为图像查看器做一个android应用程序.此应用程序将下载图像,并将其存储在缓存文件夹中.因此,在缓存文件夹中,映像文件名必须是唯一的.目前,我使用String.hashCode()来生成文件名.有没有其他更好的方法来获得唯一的字符串?hashCode的目的不是生成唯一的ID…

  10. 如何用PHP实现分布算法之一致性哈希算法

    进行大型网站的web开发时,分布式这个词经常出现在我们面前。如:memcache、redis服务器等缓存服务器的负载均衡(分布式cache)、MySQL的分布式集群,这些都会用到分布式的思想,都要理解分布式算法。接下来以缓存服务器的负载均衡来谈一下一致性哈希算法。

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部