这篇文章是我在此发现的帖子的延续
Object comparison for equality : JAVA
根据我收到的建议,我创建了以下类,并使用Eclipse IDE执行了equals(),hashcode()覆盖....所有内容。但是,当我比较使用存储这些对象的arraylist的contains()方法引用同一类的两个不同对象时,我仍然会得到错误。我不知道我的实施有什么问题。想帮助排除故障。
public class ClassA {
private String firstId;
private String secondId;
/**
* @return the firstId
*/
public String getFirstId() {
return firstId;
}
/**
* @param firstId the firstId to set
*/
public void setFirstId(String firstId) {
this.firstId = firstId;
}
/**
* @return the secondId
*/
public String getSecondId() {
return secondId;
}
/**
* @param secondId the secondId to set
*/
public void setSecondId(String secondId) {
this.secondId = secondId;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((firstId == null) ? 0 : firstId.hashCode());
result = PRIME * result + ((secondId == null) ? 0 : secondId.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final ClassA other = (ClassA) obj;
if (firstId == null) {
if (other.firstId != null)
return false;
} else if (!firstId.equals(other.firstId))
return false;
if (secondId == null) {
if (other.secondId != null)
return false;
} else if (!secondId.equals(other.secondId))
return false;
return true;
}
}
ClassA clsA1 = new ClassA();
ClassA clsA2 = new ClassA();
clsA1.setFirstId("value1");
clsA1.setSecondId("value2");
clsA2.setFirstId("value1");
clsA2.setSecondId("value2");
ArrayList a1 = new ArrayList();
ArrayList a2 = new ArrayList();
a1.add(clsA1);
a2.add(clsA2);
if(a1.contains(clsA2)
{
System.out.println("Success");
}
else
{
System.out.println("Failure");
}
我得到的结果是“失败”
答案 0 :(得分:3)
我测试了你的代码,我在Netbeans中获得了成功。有一个Typo缺少“)” 如果(a1.contains(clsA2)
“当然它失败。你的id字符串在你的测试代码中是空的,并且如果发生这种情况,则写入equals方法返回false。如果firstId和secondId都为null,或者如果其中任何一个为null,则应该允许相等而且两个都匹配。“ 真的不对。
如果两个id都为null,则equals将返回true。仅当一个ID不是。
答案 1 :(得分:2)
您收到“失败”,因为当您未将a1
添加到clsA2
时,您正在检查clsA2
是否包含a1
。检查a2.contains(clsA2)
是否应打印“成功”
答案 2 :(得分:0)
我只是复制粘贴并测试了您的代码。我获得了成功。您在a1.contains(clsA2)
之后只错过了一个括号。 eclipse生成的equals()
可以正确处理null
。