尽管同时实现了 hashCode() 和 equals(),HashSet 仍添加了重复条目

2024-03-13

我有以下课程:

class Point
{
     double x, y;

     // .... constructor and other functions here

     public boolean equals(Point p)
     {
         if(p==null) return(false);
         return(x==p.x && y==p.y);
     }

    public int hashCode()
    {
        int result=17;

        long c1=Double.doubleToLongBits(x);
        long c2=Double.doubleToLongBits(y);

        int ci1=(int)(c1 ^ (c1 >>> 32));
        int ci2=(int)(c2 ^ (c2 >>> 32));

        result = 31 * result + ci1;
        result = 31 * result + ci2;

        return result;
    }
}

现在,如果我编写以下代码:

    Point x=new Point(11,7);
    Point y=new Point(11,7);

    System.out.println("hash-code of x=" + x.hashCode());
    System.out.println("hash-code of y=" + y.hashCode());
    System.out.println("x.equals(y) = " + x.equals(y));
    System.out.println("x==y = " + (x==y));

    java.util.HashSet<Point> s=new java.util.HashSet<Point>();
    s.add(x);
    System.out.println("Contains "+y.toString()+" = "+s.contains(y));
    s.add(y);
    System.out.println("Set size: "+s.size());
    java.util.Iterator<Point> itr=s.iterator();
    while(itr.hasNext()) System.out.println(itr.next().toString());

我得到以下输出:

hash-code of x=79052753
hash-code of y=79052753
x.equals(y) = true
x==y = false
Contains (11.0,7.0) = false
Set size: 2
(11.0,7.0)
(11.0,7.0)

请帮助我理解为什么 contains() 返回 false(即使在 equals() 和 hashCode() 返回相同的值之后)以及如何纠正这个问题(即防止 Java 添加重复元素)。提前致谢。


您已将方法签名更改为Object.equals(Object),所以你没有正确覆盖equals。我建议你使用@Override注释来捕获此类错误。你的方法应该是这样的,

@Override
public boolean equals(Object o)
{
     if (this == o) {
         return true;
     }
     if (o instanceof Point) {
         Point p = (Point) o;
         return(x==p.x && y==p.y);
     }
     return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管同时实现了 hashCode() 和 equals(),HashSet 仍添加了重复条目 的相关文章

随机推荐

  • 部分重写子类中的虚拟自动属性

    是时候回答我刚刚遇到的理论问题了 以下代码有效并可编译 public class Parent public virtual object TestProperty get set public class Child Parent pri
  • 访问服务时在 Docker Swarm 1.12 中记录客户端的“真实”IP 地址

    我有 nginx 容器作为服务在用户创建的覆盖网络内的 Docker Swarm 中运行 两者都是用以下内容创建的 docker network create driver overlay proxy docker service crea
  • 是什么导致 BigDecimal.divide 出现“非终止十进制扩展”异常? [复制]

    这个问题在这里已经有答案了 我以前使用过 BigDecimals 但不经常使用 今天早上我正在做一些事情 但我不断收到以下异常 Exception in thread main java lang ArithmeticException N
  • 使用 helix 工具包创建可点击的对象

    我在 Helix Toolkit 上找到了一个例子 它被称为 ScatterPlot 它非常接近我真正需要的 但我找不到任何关于如何将 onclick 事件侦听器添加到创建的对象 在本例中为球体 的信息 这会将球体添加到 游乐场 scatt
  • jdk 1.5 中不存在 javax.swing.grouplayout

    我用netbeans开发了一个java应用程序 它使用jdk 1 6 效果很好 但现在的要求是我需要从另一台没有 netbeans 且使用 jdk 1 5 的计算机中的 java 文件构建应用程序的 jar 我无法将该机器升级到jdk 1
  • 使用宏合并 CSV 文件

    知道如何合并一个文件夹中的 csv 文件吗 我有许多具有相同结构 列数和标题 的 csv 文件 我需要将它们的内容合并到一张纸中 我知道这并不难 但是 当我从一个表添加内容时 我需要添加带有复制此数据的表名称的新列 有什么帮助吗 谢谢你 有
  • 通过构造函数传递和存储 const 引用?

    这可能是一个简单的问题 但我一直坚持下去 我试图通过它的构造函数将一个对象从 ObjectA 传递到 ObjectB 它是 ObjectA 的成员 但是 我不想传递值 而是只想传递 const 引用并无限期地存储该引用 问题是我不知道该怎么
  • 正则表达式导致“分隔符不能是字母数字或反斜杠”[重复]

    这个问题在这里已经有答案了 我有这个代码 function a menu item remove link pattern class
  • 初始化张量

    tf coo tf SparseTensor indices np array 0 0 0 1 1 2 3 9 1 4 9 9 9 9 9 9 T values 1 2 3 5 1 1 1 1 shape 10 10 我收到错误消息 Inv
  • vuejs 条件包装器

    在我的 nativescript vue 应用程序中 我有一个名为 profileForm 的单个文件组件 我想以两种方式使用该组件 如果用户登录 我希望将该组件作为布局组件的插槽来编辑配置文件 否则我想要的是作为注册表 我不想创建额外的组
  • 更新多对多关联原则2

    有什么解决方案可以自动执行此操作吗 我的两个实体 class User ManyToMany targetEntity Product inversedBy users JoinTable name user product joinCol
  • 根据条件获取Python Pandas中数据帧的第一行,而不迭代整个数据帧[重复]

    这个问题在这里已经有答案了 假设我想获取数据帧的第一行 其中某一列具有负值 import pandas as pd df pd DataFrame columns c data 2 4 2 3 1 0 index df loc df c l
  • Google 未显示 React-Helmet 标题和描述

    我使用react helmet 为我的React 应用程序的每个页面提供唯一的标题和描述 当我使用开发工具检查页面时 标题在浏览器选项卡中正确呈现 标题和描述也正确呈现 然而 谷歌并没有在搜索结果中显示标题或描述 我究竟做错了什么 我研究过
  • 根据 selectInput 更改绘图图表 y 变量

    我正在创建一个简单的折线图 可以在 Shiny 中正确呈现 我现在添加了一个 selectInput 其中包含 2 个不同度量的名称 按照它们在我的数据集中出现的方式编写 我希望我的 y 变量能够相应地改变 p lt plot ly dat
  • 在一个查询中插入两个表

    如何同时将值插入到两个表中 如果不成功 两个表都应该回滚 我正在使用 SQL Server 查询过程会抛出 C 代码 您可以将这两个查询作为一个语句运行 insert into table1 values insert into table
  • 在Android项目中使用开源库

    我是 Android 编程的初学者 我正在使用 android studio 现在我想知道从 gitHub 安装开源库的最佳方法是什么 我的问题是从组织原则的角度来看 我应该为每个库创建一个新包并将所有库源代码按原样放入该包中吗 该包应该位
  • 导入类型时 Sveltekit Typescript 解析错误

    我在一个全新的 Sveltekit 项目中有这个非常简单的组件
  • Spring data mongodb 使用 MongoTemplate 从文档中删除属性

    我有一个如下所示的文档 id ObjectId 5864ddd8e38112fd70b89893 class com apic models UserReg name xxx email email protected cdn cgi l
  • REQUEST_URI 与显式路径和文件名不匹配

    真的很困惑 因为形式和语法看起来都很好 REQUEST URI 的 RewriteCond 与显式路径和文件名不匹配 隔离时 REQUEST FILENAME 的 RewriteCond 匹配得很好 我已经使用 phpinfo 验证了 RE
  • 尽管同时实现了 hashCode() 和 equals(),HashSet 仍添加了重复条目

    我有以下课程 class Point double x y constructor and other functions here public boolean equals Point p if p null return false