相等的对象比较:JAVA

public ClassA { private String firstId; private String secondId; public void setFirstId(String firstId) { this.firstId = firstId; } public String getFirstId() { return id; } public void setSecondId(String secondId) { this.secondId = secondId; } public String getSecondId() { return secondId; } } public ClassB { private String firstId; private String secondId; public void setFirstId(String firstId) { this.firstId = firstId; } public String getFirstId() { return id; } public void setSecondId(String secondId) { this.secondId = secondId; } public String getSecondId() { return secondId; } } 

我有上面两个类(POJO),它们完全相同(当然名称除外)我将添加到两个arraylists:aListA和aListB。 我需要比较两个对象是否相同。 如果它们是相同的,我需要将它们添加到另一个列表(commonList),如果它们恰好是不同的,我需要将它们添加到另一个列表(differentList)。 我写了以下代码:

 ClassA clsA = null; public ArrayList genCommonList(aList, bList) { for(int i = 1; i<aList.size(); i++) { clsA = new ClassA; Object obj = aList.get(i); clsA = (ClassA)obj; if(bList.contains(clsA) { genCommonList.add(clsA); } } public ArrayList genDifferentList(aList, bList) { for(int i = 1; i<aList.size(); i++) { clsA = new ClassA; Object obj = aList.get(i); clsA = (ClassA)obj; if(!bList.contains(clsA) { genDifferentList.add(clsA); } } 

我的问题是,即使两个不同POJO中的数据(两个变量,firstId和secondID)相同,它们也会被放入不同的列表中。 这意味着不使用ArrayList类的contains()方法对对象进行相等性比较。 我不想从POJO中的每个变量获取数据并进行比较。 有没有办法比较两个变量的POJO并确定为相等或不相等?

尽管内容相同,但它们是不同的对象,不能满足相同的条件。 您可能需要通过迭代来显式地执行a.getfirstId()。equals(b.getfirsId())和a.getscondID()。equals(b.getSecondId())。

另一种可能性是覆盖两个POJO类中的equals和hashcode方法。 请参阅此链接以获取equals / hashcode合约 。

使用Object.equals的默认实现,不同类的两个对象永远不会相同。

如果你想要这种行为,你需要覆盖类中的.equals(以及.hashcode,查看javadoc)。

(或制作比较器并将其传递给您的collections品)。

您可以在每个将执行字段级比较的方法中实现compareTo(ClassB)或甚至compareTo(CommonInterfaceOrSuperclass)方法,如果它们符合您的比较条件,则返回true 。 然后,您需要遍历列表并检查每个元素。

另一种方法是实现equals() / hashcode()对,当正确编码时,它允许List成功找到并比较equals-ness。 然后你的contains()测试就可以了。

你想在这里做的不正确。 您要比较的2个对象不仅是不同的对象,而且也是不同的类型( ClassAClassB ),它们根本没有关系。

此外,如果你试图比较这样

 if(bList.contains(clsA)) 

由于bList包含ClassB类型的对象,而clsA的类型为ClassA ,因此将使用java.lang.Object类的equals()方法对它们进行比较。 因此,当且仅当xy引用同一个对象时, x.equals(y)返回truex == y的值为true )。