【发布时间】:2020-07-18 20:58:44
【问题描述】:
我有一个名为Record 的对象类,它由Data 类对象的向量组成
对象类Data只有两个变量
Object value;
String name;
我重写Record类中的equals方法如下:
public boolean equals(Object obj) {
boolean check = true;
for(int i=0; i<this.coloumnsOfData.size();i++) {
System.out.println( ((Record) obj).coloumnsOfData.get(i).name + " OBJECT " + ((Record) obj).coloumnsOfData.get(i).value );
System.out.println( coloumnsOfData.get(i).name + " THIS " + coloumnsOfData.get(i).value );
if( !((((Record) obj).coloumnsOfData.get(i).name).equals(this.coloumnsOfData.get(i).name)) || !((((Record) obj).coloumnsOfData.get(i).value).equals(this.coloumnsOfData.get(i).value))) {
check=false;
}
}
return (obj instanceof Record && check);
}
我初始化 HashSet 如下:
Set<Record> answer= new HashSet<Record>()
并开始测试
Record r1 = new Record();
r1.coloumnsOfData.add(new Data(new Double( 1.5 ),"gpa"));
r1.coloumnsOfData.add(new Data(new String("John"),"name"));
r1.coloumnsOfData.add(new Data(new Integer( 2 ),"id"));
Record r2 = new Record();
r2.coloumnsOfData.add(new Data(new Double( 1.5 ),"gpa"));
r2.coloumnsOfData.add(new Data(new String("John"),"name"));
r2.coloumnsOfData.add(new Data(new Integer( 2 ),"id"));
System.out.println(r1.equals(r2)); //RETURNS TRUE
answer.add(r1);
System.out.println(answer.contains(r2)); //RETURNS FALSE
任何帮助理解问题所在将不胜感激。
【问题讨论】:
-
你也覆盖
hashCode? -
@JacobG.No 不,我不是,我不太清楚为什么我应该这样做,或者如何准确地实现它
-
可能是你的 2 个对象相等,但它们不是同一个实例。
-
@ThallsEternal 我该如何解决这个问题?
-
obj instanceof Record应该是要检查的第一个 项,而不是最后一项。最值得注意的是,它应该发生在您执行(Record) obj类型转换之前。除此之外,既不使用new Double( 1.5 )、new String("John"),也不使用new Integer( 2 )。使用1.5、"John"和2。实际问题已经解释过了,没有正确的hashCode()实现,你不能使用HashSet。
标签: java collections equals contains hashset