当前位置: 首页 > 面试题库 >

Java HashSet如果包含的元素被修改,则包含重复项

孙和安
2023-03-14
问题内容

假设您有一个类,并创建了一个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验证其内容,以便删除在上述情况下创建的可能重复条目?

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


问题答案:

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



 类似资料:
  • 我需要创建一个客户列表,每个客户都有一个工作列表。当将一个列表分配给一个客户机时,它是通过引用传递的,对列表的任何更改(例如清除列表)也会反映在客户机对象中。 我该如何避免这种情况?

  • 例如 我想从list1中删除list1中所有在list2中的元素,所以我做了什么

  • 问题内容: By Company   我需要捕获上述元素的xpath。我尝试了以下替代方法,但在Chrome中似乎没有任何效果。您能否建议其他选择。 问题答案: 要查找元素: 您可以使用以下xpath之一: 使用: 使用: 但是,理想情况下,您可能希望避免使用 NO-BREAK SPACE 字符,并使用以下任一解决方案: 使用: 使用: 参考 您可以在以下位置找到相关的详细讨论: 使用XPATH搜

  • 定义 一个应用可以包含其他应用。一个被包含的应用有它自己的应用目录和 .app 文件,但是它是作为另一个应用的监督树的一部分被启动的。 一个应用只能被一个其他的应用所包含。 一个被包含的应用也可以包含其他应用。 一个不被任何其他应用所包含的应用被称之为主应用。 应用控制器在加载一个主应用的时候会自动加载任何被包含的应用,但并不会启动它们。被包含的应用的顶层督程应由进行包含的应用的某个督程来启动。

  • 有没有人知道一个vba代码,如果a列中的任何单元格包含单词“total”,就可以删除整行?例如,A38包含“total”,则删除整行。下个月,单元格A44包含单词“total”,删除整行。诸如此类....谢谢!

  • 在XML文档中,例如: 如果任何元素包含'Text1'的内部文本,则返回Null集的单个XPath 1.0兼容、local-namespace()兼容的表达式是什么? 我尝试了许多不同的表达式,但无法获得返回空集的元素。 例如。 严格的要求是由于一个具体的实施。NET函数调用XmlNode.选择单节点方法(字符串) Dimitre提供的最终精确解