如果修改了包含的元素,Java HashSet 将包含重复项

2023-11-30

假设您有一个类,并且创建了一个可以存储该类的实例的 HashSet。如果您尝试添加相等的实例,则集合中只会保留一个实例,这很好。

但是,如果 HashSet 中有两个不同的实例,并且您获取一个实例并使其成为另一个实例的精确副本(通过复制字段),则 HashSet 将包含两个重复的实例。

这是演示这一点的代码:

 public static void main(String[] args)
    {
         HashSet<GraphEdge> set = new HashSet<>();
        GraphEdge edge1 = new GraphEdge(1, "a");
        GraphEdge edge2 = new GraphEdge(2, "b");
        GraphEdge edge3 = new GraphEdge(3, "c");

        set.add(edge1);
        set.add(edge2);
        set.add(edge3);

        edge2.setId(1);
        edge2.setName("a");

        for(GraphEdge edge: set)
        {
            System.out.println(edge.toString());
        }

        if(edge2.equals(edge1))
        {
            System.out.println("Equals");
        }
        else
        {
            System.out.println("Not Equals");
        }
    }

    public class GraphEdge
    {
        private int id;
        private String name;

        //Constructor ...

        //Getters & Setters...

        public int hashCode()
        {
        int hash = 7;
        hash = 47 * hash + this.id;
        hash = 47 * hash + Objects.hashCode(this.name);
        return hash;    
        }

        public boolean equals(Object o)
        {
            if(o == this)
            {
                return true;
            }

            if(o instanceof GraphEdge)
            {
                GraphEdge anotherGraphEdge = (GraphEdge) o;
                if(anotherGraphEdge.getId() == this.id && anotherGraphEdge.getName().equals(this.name))
                {
                    return true;
                }
            }

                return false;
        }
    }

上述代码的输出:

1 a
1 a
3 c
Equals

有没有办法强制 HashSet 验证其内容,以便删除在上述场景中创建的可能重复条目?

一种可能的解决方案是创建一个新的哈希集并将内容从一个哈希集复制到另一个哈希集,以便新的哈希集不会包含重复项,但我不喜欢这种解决方案。


你所描述的情况是无效的。请参阅Javadoc:“如果对象的值以影响等于比较的方式更改,而该对象是集合中的元素,则不会指定集合的​​行为。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果修改了包含的元素,Java HashSet 将包含重复项 的相关文章

  • 抽象超类的默认接口方法

    可以说我有以下结构 abstract class A abstract boolean foo interface B default boolean foo return doBlah class C extends A implemen
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • 使用 xuggle 将 mp3 转换为 wav 出现异常

    我正在尝试将 mp3 转换为 wav 代码在这里 String mp3 F work pic2talk38512 mp3 String wav F work pic2talk38512 wav TranscodeAudioAndVideo
  • Eclipse 自动完成更改变量名称

    只是一个愚蠢的问题 但很难搜索 因为有很多关于 Eclipse 自动完成的主题 而且很难找到与我的问题匹配的内容 所以问题是 如果我写 MyClass MyVarName 然后按空格键 添加 new MyClass Eclipse 自动添加
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • DateTimeFormatter.parseLocalDate 抛出 UnsupportedOperationException

    该API用于解析本地日期 http joda time sourceforge net apidocs org joda time format DateTimeFormatter html parseLocalDate 28java la
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • 将 EditText 聚焦在设备上运行的 PopupWindow 中时出现异常

    我正在为 Android 开发一个弹出窗口 它正在工作 我在上面添加了一个 EditText 和一个按钮 当在 ADV 上运行时 它可以正常工作 而在设备上运行时 当我专注于 EditText 时 这会抛出一个奇怪的异常 android v
  • 驱动程序信息:driver.version:未知,使用 ChromeDriver v78.0.3904.70 和 Chrome 浏览器 v78.0.3904.97

    我使用的是java 1 8和chrome浏览器版本78 0 3904 97 我正在尝试使用 chrome 驱动程序版本执行我的 selenium 脚本代码78 0 3904 70 但在执行时我面临以下问题并且 chrome 立即崩溃 Pic
  • Java中无参数的for循环

    我在看别人的代码 发现了这段代码 for 我不是 Java 专家 这行代码在做什么 起初 我认为这会创建一个无限循环 但在该程序员使用的同一个类中 while true 其中 如果我错了 请纠正我 是一个无限循环 这两个相同吗 为什么有人会
  • 多对多不检索映射数据

    Spring boot 2 5 6 我无法安装版本 概要文件 java Getter Setter NoArgsConstructor AllArgsConstructor EqualsAndHashCode FieldDefaults l
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • Java .split("|") 不工作

    我刚刚遇到了一个问题分割法 http docs oracle com javase 6 docs api java lang String html split 28java lang String 29for 字符串不适用于字符 作为一个
  • Storm Spout 未收到 Ack

    我已经开始使用storm 所以我使用创建简单的拓扑本教程 https github com nathanmarz storm wiki Tutorial 当我运行我的拓扑时LocalCluster一切看起来都很好 我的问题是我没有得到元组的
  • Apache Kafka 是否提供异步订阅回调 API?

    我的项目正在将 Apache Kafka 视为老化的基于 JMS 的消息传递方法的潜在替代品 为了让这个过渡尽可能的顺利 如果替代的排队系统 Kafka 有一个异步订阅机制那就更理想了 类似于我们当前项目使用的JMS机制MessageLis
  • 如何使用 Nimbus LookAndFeel 更改 JToolTip 的背景颜色?

    在使用 Nimbus LookAndFeel 的基于 Swing 的 Java 应用程序中 我尝试设置工具提示的背景颜色 因此 我创建了 JToolTip 的子类 并通过重写 createToolTip 在我的组件中使用它 到目前为止一切正
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢

随机推荐

  • 从文件夹中的所有工作簿中删除 VBA 代码

    我正在尝试构建代码来远程循环包含 xls 文件的文件夹并删除其中包含的宏 到目前为止 我已经使各个组件正常工作 但在激活各种工作簿 然后以编程方式确保每个文件中引用 Microsoft Visual Basic for Applicatio
  • 使用 read() 方法从 Amazon S3 读取大尺寸 JSON 文件时出现内存错误

    我正在尝试使用 Python 将大量 JSON 文件从 Amazon S3 导入到 AWS RDS PostgreSQL 中 但是 这些错误发生了 回溯 最近一次调用最后一次 文件 my code py 第 67 行 位于 file con
  • Eclipse SVN 同步工作区错误 - 更新 SVN 工作区的同步视图 - java/nio/file/Paths

    我今天更新了 Eclipse SVN 插件 之后我无法将我的工作区与 SVN 存储库同步 我使用的是java 1 6 我也尝试过使用java 1 7 我仍然在 Eclipse 中遇到以下错误 期间发生内部错误 更新 SVN 工作区的同步视图
  • 如何在 OS X 上将进程窗口置于前台?

    我有一个简单的 shell python 脚本 可以打开其他窗口 我想在脚本完成后将运行脚本的终端带到前台 我知道我的父窗口的进程ID 如何将给定窗口置于前台 我想我必须一路从 PID 中找出窗口名称 不确定是否有proper方式 但这对我
  • 嵌套 HTML 列表中的不同字体大小

    我创建了一个嵌套的ol li为我的网站列出 CSS 中的类 但由于每个li显示在不同的font size 虽然我已经定义了font size to it number list ol font normal 1 2em Arial Helv
  • 如何设置等高线标签的背景颜色

    我正在使用命令 axins clabel c levls fontsize 4 fmt 4 2f colors white 为了为我的轮廓生成标签 我希望它们是白色的 颜色 白色 有效 和红色背景 我不知道是否可以为它们指定背景颜色 我迟到
  • eclipse c++ 没有什么可构建错误

    所以我尝试构建一个 C 项目 但随后出现此错误 Build of configuration Release for project p Internal Builder is used for build Nothing to build
  • 类型实例化太深并且可能是无限的

    这里如何处理这个错误呢 我可以限制递归深度 或者只是告诉 TS 可以吗 export type StateUnion
  • 检查当前用户是否是活动目录组的成员

    我需要检查当前用户是否是活动目录组的成员 我首先获取当前用户 如下所示 现在我想知道如何检查此 CurrentUser 是否在活动目录组 CustomGroup 中 string CurrentUser WindowsIdentity Ge
  • Flutter/Dart语言的客户端证书认证

    我对证书世界相当陌生 我决定创建一个必须使用证书来访问 API 的应用程序 我创建了自签名 CA 证书 SSL 证书和客户端证书 我将它们导入 Windows Server 并正确配置 IIS 我可以使用 clientcertificate
  • 当字符串为十六进制且前缀为“0x”时,将字符串转换为整数时不一致

    使用 PHP 5 3 5 不确定这在其他版本上如何工作 我对使用包含数字的字符串感到困惑 例如 0x4B0 or 1 2e3 PHP 处理此类字符串的方式对我来说似乎不一致 只有我一个人吗 或者这是一个错误 或者未记录的功能 或者我只是错过
  • Android 嵌套列表视图

    是否可以 建议使用嵌套列表视图 即包含在另一个列表视图的一行中的列表视图 一个例子是我的主列表显示博客文章 然后在每一行中 您都会有另一个列表视图来显示每个帖子的评论 这将是可折叠的 我今天遇到了同样的问题 所以这就是我解决它的方法 我有一
  • 用于聚合/串联的 SQL 查询

    我有一个这样的表 ID Name 1 john 1 molly 2 greg 2 sean 1 holly 2 mill SQL 查询应该是什么来聚合结果 如下所示 ID Name 1 john molly holly 2 greg sea
  • SQL Server 静默截断存储过程中的 varchar

    根据本次论坛讨论 SQL Server 我使用的是 2005 但我收集这也适用于 2000 和 2008 默默地截断任何varchar您将 varchar 的长度指定为存储过程参数 即使直接使用INSERT实际上会导致错误 例如 如果我创建
  • 对具有输入和输出历史依赖性的操作进行矢量化的最佳方法?

    我的目标是在 numpy 中向量化以下操作 y n c1 x n c2 x n 1 c3 y n 1 If n是时间了 我基本上需要依赖于之前的输入以及之前的输出的输出 我被赋予的价值观x 1 and y 1 另外 这是我的实际问题的通用版
  • 如何在ListView中单击复选框时使按钮栏从底部滑入?

    我有一个带有自定义列表适配器的列表视图 它使用复选框和一些文本视图填充列表视图 当用户选择一个复选框时 我需要一个按钮栏从屏幕底部滑入视图并坐在那里 我已经制作了按钮栏 并且可以通过将其可见性更改为 消失 和 可见 来使其在屏幕上出现和消失
  • 如何用空格/空格替换连字符? php

    我对 PHP 不太了解 但这些天我正在修改现有的脚本 我想知道如何用空白或空白替换 例如 一个变量包含 爱你 我想用 爱你 这样的空格替换它们之间的连字符 我会感谢您的反馈 str str replace Love you now str是
  • 全局内核中的 CUDA 变量

    我的问题是 1 我的理解是否正确 当您在全局内核中声明一个变量时 每个线程都会有该变量的不同副本 这允许您为每个线程在该变量中存储一些中间结果 示例 向量 c a b global void addKernel int c const in
  • 在 Twitter Api 中通过 id 获取用户名

    如何通过对 Twitter Api 的请求通过 userid 获取用户名 其他一些方法 例如followers ids 给我们一个 ID 数组作为响应 我不知道如何从中获取他们的用户名 该方法的响应 followers ids 看起来像这样
  • 如果修改了包含的元素,Java HashSet 将包含重复项

    假设您有一个类 并且创建了一个可以存储该类的实例的 HashSet 如果您尝试添加相等的实例 则集合中只会保留一个实例 这很好 但是 如果 HashSet 中有两个不同的实例 并且您获取一个实例并使其成为另一个实例的精确副本 通过复制字段