相等的对象比较:JAVA

时间:2012-02-11 03:57:12

标签: java object comparison equality

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并确定为相等或不相等?

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

另一种方法是实施equals() / hashcode()对,如果编码正确,可以让List成功找到并比较equals-ness。然后,您的contains()测试将有效。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

此外,如果你试着像这样比较

if(bList.contains(clsA))

由于您的bList包含ClassB类型的对象且clsA类型为ClassA,因此将使用java.lang.Objectequals()对其进行比较方法。 因此x.equals(y)返回true当且仅当xy引用相同的对象(x == y具有值true)时。{/ p>