首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.util.Set何时检查重复项

java.util.Set何时检查重复项
EN

Stack Overflow用户
提问于 2012-05-30 18:51:53
回答 2查看 8.9K关注 0票数 12

我有一个非常基本的问题,java.util.Set什么时候检查添加的对象是否重复?

因为我有一个如下所示的模型类,它覆盖equals和hashcode方法

代码语言:javascript
复制
public class SampleModel implements Comparable {
    private String name;

    public SampleModel(String name) {
        this.name = name;
    }

    // Setter and Getter omitted
    @Override
    public boolean equals(Object arg0) {
        boolean eq = false;

        if (arg0 instanceof SampleModel
                && this.name.equalsIgnoreCase(((SampleModel) arg0).name)) {
            eq = true;
        }
        return eq;
    }

    @Override
    public int compareTo(Object arg0) {
        return this.name.compareTo(((SampleModel) arg0).name);
    }

    @Override
    public int hashCode() {
        return this.name.length();
    }
}

这就是我在HashSet中使用模型对象的方式。

代码语言:javascript
复制
    SampleModel s1 = new SampleModel("Satya");
    SampleModel s2 = new SampleModel("Katti");

    Set<SampleModel> samSet = new HashSet<SampleModel>();
    System.out.println(samSet.add(s1));
    System.out.println(samSet.add(s2));

    s2.setName("Satya");
    System.out.println(s2.getName());
    System.out.println(s1 + ", " + s2);

根据相等条款,对象是相同和相等的,但HashSet将包含重复项。

是否存在任何违反w.r.t equals或hashcode的情况?如果这段代码完全正确,那么有什么方法可以防止添加重复的代码吗?

我假设,在确定equals和hashcode时使用的任何字段都应该是不可修改的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-30 18:55:09

我假设,在确定equals和hashcode时使用的任何字段都应该是不可变的?

没错。

更准确地说,您问题中的代码违反了Set合同的以下部分:

注意:如果将可变对象用作集合元素,则必须格外小心。当对象是集合中的元素时,如果对象的值以影响等于比较的方式更改,则不指定集合的行为。这一禁令的一个特例是,集合不允许将其自身包含为元素。

一旦你违反了合同,所有的赌注都会取消。

票数 18
EN

Stack Overflow用户

发布于 2014-09-08 22:07:32

要理解的示例:

代码语言:javascript
复制
import java.util.*;

public class Vector1{

  public static void main(String args[]){


    Set v=new HashSet();
    Student st=new Student("12","naushad");
    Student st1=new Student("12","naushad");
    v.add(st1);
    v.add(st);
    System.out.println(st.hashCode());
    st.sname="shouzia";
    System.out.println(st.hashCode());

    v.add(st);
    v.add(st);
    v.add("naushad");
    v.add("naushad");
    v.add("naushad");

    System.out.println(v);
    }

}

class Student{

    public String sid;
    public String sname;

    Student(String sid,String sname){
        this.sid=sid;
        this.sname=sname;
    }

    public String toString(){

        return sid+"\t"+sname;
    }

}

我已经用相同的数据实例化了两个对象,它将存储在Set中,因为它们都包含不同的哈希码,所以这里不需要比较equals()方法。

如果hashcode()方法返回相同的hashcode,那么它将检查具有对象属性的equals()方法,并检查对象属性是否有某些更改?根据结果,它会将该对象存储在集合中,也可以不存储。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10814824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档