我有一个非常基本的问题,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);根据相等条款,对象是相同和相等的,但HashSet将包含重复项。
是否存在任何违反w.r.t equals或hashcode的情况?如果这段代码完全正确,那么有什么方法可以防止添加重复的代码吗?
我假设,在确定equals和hashcode时使用的任何字段都应该是不可修改的?
发布于 2012-05-30 18:55:09
我假设,在确定equals和hashcode时使用的任何字段都应该是不可变的?
没错。
更准确地说,您问题中的代码违反了Set合同的以下部分:
注意:如果将可变对象用作集合元素,则必须格外小心。当对象是集合中的元素时,如果对象的值以影响等于比较的方式更改,则不指定集合的行为。这一禁令的一个特例是,集合不允许将其自身包含为元素。
一旦你违反了合同,所有的赌注都会取消。
发布于 2014-09-08 22:07:32
要理解的示例:
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()方法,并检查对象属性是否有某些更改?根据结果,它会将该对象存储在集合中,也可以不存储。
https://stackoverflow.com/questions/10814824
复制相似问题