JAVA中的对象比较…第2部分

JAVA中的对象比较…第2部分,java,object,comparison,equals,hashcode,Java,Object,Comparison,Equals,Hashcode,这篇文章是我在这里找到的上一篇文章的延续 根据我收到的建议,我创建了以下类,并使用EclipseIDE实现了equals()、hashcode()覆盖…所有内容。但是,当我使用存储这些对象的arraylist的contains()方法比较引用同一类的两个不同对象时,仍然得到一个false。我不知道我的实现中出了什么问题。想帮忙排除故障 public class ClassA { private String firstId; private String secondId; /** * @

这篇文章是我在这里找到的上一篇文章的延续

根据我收到的建议,我创建了以下类,并使用EclipseIDE实现了equals()、hashcode()覆盖…所有内容。但是,当我使用存储这些对象的arraylist的contains()方法比较引用同一类的两个不同对象时,仍然得到一个false。我不知道我的实现中出了什么问题。想帮忙排除故障

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

我得到的结果是“Failure”

您得到的是“Failure”,因为您正在检查
a1
是否包含
clsA2
,而您没有将
clsA2
添加到
a1
。检查
a2.contains(clsA2)
应打印“Success”

您将得到一个“Failure”,因为您在检查
a1
是否包含
clsA2
时,尚未将
clsA2
添加到
a1
。检查
a2.contains(clsA2)
是否应打印“Success”

我在Netbeans中测试了您的代码,获得了成功。中有一个拼写错误“)” 如果(a1)包含(clsA2)

当然失败了。您的id字符串在测试代码中为null,如果出现这种情况,equals方法将被写入返回false。如果firstId和secondId都为null,或者如果其中一个为null且另一个都匹配,您可能应该允许相等 这真的不对


如果两个ID都为null,那么equals将返回true。只有当一个ID不为null时才返回true。

我测试了你的代码,在Netbeans中获得了成功。在 如果(a1)包含(clsA2)

当然失败了。您的id字符串在测试代码中为null,如果出现这种情况,equals方法将被写入返回false。如果firstId和secondId都为null,或者如果其中一个为null且另一个都匹配,您可能应该允许相等 这真的不对


如果两个ID都为null,那么equals将返回true。只有一个ID不是。我只是复制粘贴并测试了您的代码。我成功了。您只遗漏了
a1.contains(clsA2)
后面的一个括号。eclipse生成了
equals()
正确处理
null

我只是复制粘贴并测试了你的代码。我成功了。你只遗漏了
a1.contains(clsA2)
后面的一个括号。eclipse生成的
等于()
确实正确地处理了
null

我的想法是比较是否有一个clsA2的对象,它与包含clsA1类型对象的数组中的clsA1中的某个对象等效。啊,好吧。看起来应该这样做了。我会尝试使用调试器单步执行equals方法,看看哪个检查失败嗯,我的想法是比较是否有一个clsA2的对象,它与包含clsA1类型对象的数组中的clsA1中的某个对象等效。啊,好吧。看起来应该可以了。我会尝试使用调试器单步执行equals方法,以查看哪个检查失败。抱歉,,,我已经更新了我的代码。这两个对象属性具有相同的值…但我得到了失败…我现在看到的唯一一件事是缺少“)”,我希望您在代码中正确地使用它?如果(a1)包含(clsA2)对不起,伙计们…这是我的错。我从一个不应该使用的表中获取数据。这会产生我没有预料到的结果,因此出现这个问题。上面的代码工作得很好。感谢所有人的帮助。对不起,,,我已经更新了代码。两个对象属性都有相同的值。但是我得到了失败…我唯一需要做的是ee现在是缺失的“),我希望您的代码中有正确的代码?如果(a1.contains)(clsA2)对不起,伙计们……这是我的错。我从一个不应该使用的表中获取数据。这给出了我没有预料到的结果,因此出现了这个问题。上面的代码工作得很好。感谢所有人的帮助。