簡體   English   中英

java.util.Set什么時候檢查重復項

[英]When does java.util.Set check for duplicates

我有一個非常基本的問題,java.util.Set何時檢查添加的對象是否重復?

因為我有一個如下所示的模型類,它會覆蓋equals和hashcode方法

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中使用模型對象的方法。

    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);

根據equality子句,對象是相同且相等的,但HashSet將包含重復項。

是否有任何違反wrt equals或hashcode的事件? 如果這段代碼完全沒問題,那么有什么方法可以防止添加重復項?

我假設,在確定equals和hashcode時使用的任何字段應該是immutabe?

我假設,在確定equals和hashcode時使用的字段應該是不可變的嗎?

那就對了。

更確切地說,您的問題中的代碼違反了Set合同的以下部分:

注意:如果將可變對象用作set元素,則必須非常小心。 如果在對象是集合中的元素的同時以影響等於比較的方式更改對象的值,則不指定集合的​​行為。 這種禁令的一個特例是,不允許集合將自身作為一個要素包含在內。

一旦違反合同,所有投注都將被取消。

要了解的示例:

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()方法返回相同的哈希碼,那么它將使用object屬性檢查equals()方法並檢查,對象屬性是否有一些變化? 根據結果​​,它將該對象存儲在集合中,或者可能不存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM