哈希集的哈希码和等于[重复]

2023-11-25

请澄清我对 Hashset 的疑问。考虑下面的代码,

class Person
{
    String name;

    Person(String n)
    {
        name=n; 
    }
    public String getName()
    {
        return name;   
    }

    @Override
    public boolean equals(Object arg0) {

        System.out.println("in equals");

        Person obj=(Person)arg0;

        System.out.println("1st "+getName());
        System.out.println("2nd "+obj.getName());

        if(this.getName().equals(obj.getName()))
        {
                return true;
        }
        return false;
    }


    @Override
    public int hashCode() {

        System.out.println("in hash code");
        System.out.println(" value is "+Integer.valueOf(name.charAt(0)));
        return Integer.valueOf(name.charAt(0));
    }
}

主要我有以下代码

Person obj1=new Person("bcd");

Person obj2=new Person("cde");

Person obj3=new Person("abc");

Person obj4=new Person("abc");

现在,如果我将这些对象添加到哈希集中

Set<Person> sset=new HashSet<Person>();

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj3);

我得到这个输出

in hash code                                                                      
value is 98    
in hash code   
value is 97    
in hash code    
value is 99    
in hash code    
value is 97  
in equals  
1st abc     
2nd abc

问题1:为什么 equals() 函数只调用一次来检查 obj3 和 obj4 ?为什么不检查其余对象?

问题2:如果答案是因为它们都有相同的哈希码,只有这样才会调用 equals,那么为什么下面的代码不调用它

sset.add(obj1);
sset.add(obj4);
sset.add(obj2);
sset.add(obj4);

输出是:

in hash code  
value is 98  
in hash code   
value is 97   
in hash code   
value is 99   
in hash code  
value is 97 

即使两个相同的对象被添加到具有相同哈希码的哈希集中,它也不会进入 equals() 方法。

问题3:我迭代了上面的值并打印了内容,但是 hashcode 和 equals 都没有被调用。什么时候重写 hashcode 和 equals 方法真正有用?

问题4: 什么时候会hashCode() and equals()叫做?


  1. 没有必要打电话equals if hashCode不同。
  2. 没有必要打电话hashCode if (obj1 == obj2).
  3. 没有必要hashCode and/or equals只是为了迭代 - 你不是在比较对象
  4. 当需要区分对象时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈希集的哈希码和等于[重复] 的相关文章

  • Netbeans 8.1 Gnome 3 GTK+ UI 字体和选项卡高度

    我刚刚在运行 GNOME 3 桌面的 Ubuntu 16 04 上安装了 NetBeans 8 1 如果可能的话 我想继续使用 IDE 的 GTK 外观和感觉 但 UI 上的字体 尤其是选项卡中的字体 太小且重叠 我尝试添加 fontsiz
  • java中监视目录变化

    我正在使用 WatchService 来监视目录中的更改 特别是目录中新文件的创建 下面是我的代码 package watcher import java nio file import static java nio file Stand
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • Intellij idea插件开发-热重载?

    我正在为 intellij idea 创建一些插件 每次更改代码时 我都需要重新运行应用程序 有类似热重载或类似的东西吗 或者更有效的方法 我相信您正在寻找运行 gt 重新加载更改的类 通常只要进行一些小的改变就可以很好地工作
  • 使用 Jquery 进行时间验证

    我在用jquery 验证插件验证我的表格 要验证文本输入 我所做的就是编写class required 在属性中 它为我进行验证 现在我正在尝试验证用户必须输入时间 如 02 45 00 AM 的输入 但我正在使用的插件没有任何时间验证功能
  • 如何在 DropWizard 中维护用户会话?

    我正在寻找一个持久会话管理器 它将会话保存在可与 DropWizard 一起使用的文件系统 如 PHP 上 我看到有一个Environment getSessionHandler 但我没有看到任何相关文档 我可以自己写 但我希望能吃到一顿熟
  • 尽快将PageTransformer应用到PagerView

    我将 PageTransfomer 应用于 ViewPager 效果很好 但我想在将 PageTransformer 设置为 ViewPager 后立即启动页面的转换 我已经尝试过 设置当前项目 int setCurrentItem int
  • 使用 Python 时,这段代码中的“wb”是什么意思?

    Code file pinax media a jpg wb 文件模式 写入和二进制 由于您正在编写 jpg 文件 因此看起来不错 但是如果你想读取 jpg 文件 你需要使用 rb 更多信息 在 Windows 上 b 附加到模式后 以二进
  • 将 JTextArea 复制为“text/html”DataFlavor

    我有一个JTextArea我正在使用Highlighter按照下面的 SSCCE 对我的某些文本应用一些语法突出显示 import java awt import java awt event import javax swing impo
  • 如何在 Activity 和 widget 之间共享数据?

    我阅读了 hellowidget 教程和开发指南的应用程序小部件 然后我知道如何创建一个包含按钮或文本或其他内容的小部件 但我真正想做的是让它与我的应用程序交互 例如 我想创建一个具有文本视图的小部件 当我单击它时 它会向我的活动发送一个
  • 查找已安装的 JDBC 驱动程序

    我正在用 Java 编写一个数据库验证工具 并具有首选项屏幕 以便用户可以定义他们的数据库连接 该工具至少应该能够处理 DB2 Oracle Postgresql 和 Mysql 我真正想要的是能够向用户展示他们已安装的 jdbc 驱动程序
  • 如何在 iOS 9 中的 UIAlertController 中添加按钮

    我们如何使用UIAlertView在 iOS 9 中以及如何添加按钮UIAlertController UIAlertController alert UIAlertController alertControllerWithTitle T
  • 为什么 Eclipse 的 Android 设备选择器不显示我的 Android 设备?

    我正在使用 Eclipse 的 Android 插件 当我尝试通过真实设备运行我的程序时Android 设备选择器 我的手机未列为设备 我已经更新了 Eclipse 所有 Android 软件包和 USB 驱动程序 但它仍然没有显示 我的手
  • 如何让SceneView的背景透明?

    我想打开一个 3D 模型并使其背景透明 以便我可以看到 SceneView 后面的 UI 我试过这段代码 但 sceneView 变成白色 不透明 struct ModelView View var body some View ZStac
  • Spring Data Cassandra LocalDateTime 转换

    我正在开发一个项目 其中我们有一个实体 我们想要保留 LocalDateTime 类型的字段 我们知道 cassandra 没有对此类型转换的本机支持 我们使用 Spring 对转换器的支持创建了自己的自定义转换器 然而 Spring Da
  • Android 启用和禁用 GPS [重复]

    这个问题在这里已经有答案了 可能的重复 像 Tasker 一样以编程方式启用 GPS 我是一名初学者 Android 开发者 我想通过单击按钮来启用和禁用 GPS 而不运行此意图 intente in new Intent android
  • 如何使用Python中的套接字响应代理服务器中的“CONNECT”方法请求?

    我目前正在使用 httplib 编写代理服务器 当我尝试连接到 HTTPS 网站 例如 facebook 和 google 时 我的客户端向我发送 CONNECT 请求 如下所示 CONNECT www google co il 443 H
  • PHP 命名空间可以包含变量吗?

    PHP 命名空间可以包含变量吗 如果是这样 如何实现这一点 不可以 您可以在声明命名空间后设置变量 但变量将始终存在于全局范围内 它们永远不会绑定到名称空间 您可以从缺少任何名称解析描述的情况中推断出这一点 常见问题解答 有关命名空间您需要
  • 不使用 NewID() 的 SQL 上的随机数

    您好 我想生成一个唯一的随机数 而不使用以下语句 Convert int CHECKSUM NEWID 100000 AS ITEM 因为当我在 from 上使用连接子句时 它通过使用 NEWID 生成双寄存器 我使用 SQL Server
  • 如何在MySQL中进行级联更新?

    Let s look at this example database 正如我们所看到的 person 取决于城市 person city id 是外键 我不删除行 只是将它们设置为非活动状态 活动 0 将城市设置为非活动状态后 如何自动将
  • 默认导出类的新实例

    下面的代码片段每次导入时都会生成新实例吗 1st implementation class ConnectionManager export default new ConnectionManager 2nd implementation
  • google api javascript 登录用户的电子邮件

    有许多资源和堆栈溢出问题与我将要问的类似但不完全相同 我将在这里重新讨论一些解决方案并进行解释 我有一个已经登录 Google 的用户 我所说的登录是指手动登录并且存在 cookie 我的应用程序未登录 我只需要获取电子邮件地址 我见过 3
  • 哈希集的哈希码和等于[重复]

    这个问题在这里已经有答案了 请澄清我对 Hashset 的疑问 考虑下面的代码 class Person String name Person String n name n public String getName return nam