1

我正在尝试将 DTO 的多个对象放入ArrayList一个for循环中。添加所有对象后,为了避免重复,我将转换ArrayListHashSet以避免重复记录。

代码片段 -

....

ArrayList list = new ArrayList();

for( .... ){ 
  Class factory = DTO.getClass();
  Object bean = factory.newInstance();
  list.add(bean);
}

return new ArrayList(new HashSet(list));

但是返回的ArrayList有重复,我想避免。

4

3 回答 3

3

即使 DTO 的两个实例包含完全相同的值,HashSet 也会认为它们不同。要被视为相等,dto1.equals(dto2)(and dto2.equals(dto1)) 必须返回 true。因此,您必须重写Object.equals()DTO 中的方法,以指定两个 DTO 实例何时相等。而当你覆盖时equals(),你也必须覆盖hashCode()。两个相等的对象必须具有相同的 hashCode。

阅读这两种方法的文档,如果您不知道如何实现它们,请使用您的 IDE 生成这两种方法。

于 2013-05-19T10:04:22.857 回答
3

您需要覆盖从 Object 继承的 equals 和 hashcode 方法。Java 不知道这两个对象是否相等,除非您告诉它要比较什么。Hashset 类将调用对象的 equals 方法进行比较

让我们以汽车为例,它有两个字段;类型和颜色。如果两个对象的类型和颜色相同,则它们将被视为相等。

如果我们不重写 equals 方法,当我们有两个相同的对象时,我们将得到 false

public class Car {

private String type;
private String color;

public Car(String type, String color) {
    super();
    this.type = type;
    this.color = color;
}
public static void main(String[] args) {
    Car car1 = new Car("Suv","Green");
    Car car2 = new Car("Suv","Green");
    System.out.println(car1.equals(car2)); //false
}

}

在这个例子中,我们将告诉 java 我们希望它如何通过覆盖 equals 方法来比较对象

private String type;
private String color;

public Car(String type, String color) {
    super();
    this.type = type;
    this.color = color;
}
@Override
public boolean equals(Object obj) { 
    if (this.getClass() == obj.getClass()){
        Car other =(Car)obj;
        if(this.color.equals(other.color) && this.type.equals(other.type)){
            return true;
        }
    }
    return false;
}
public static void main(String[] args) {
    Car car1 = new Car("Suv","Green");
    Car car2 = new Car("Suv","Green");
    System.out.println(car1.equals(car2)); //true
}

运行这个例子你会得到真实的。

如果您使用没有覆盖等于的对象测试哈希集,您将在它们的两个类中都有,因为 java 认为它们是不同的对象,因为等于返回 false。用覆盖的方法测试它,你只会有一个

此外,任何时候您覆盖 equals 时,您也应该覆盖 hashCode。使用您最喜欢的 IDE 来帮助您解决这些问题。

希望这可以帮助!

于 2013-05-20T04:23:18.783 回答
-1

您应该Set直接使用接口的类。这个根据定义避免重复

http://docs.oracle.com/javase/6/docs/api/java/util/Set.html

Set list = new HashSet();

for( .... ){ 
    Class factory = DTO.getClass();
    Object bean = factory.newInstance();
    list.add(bean);
}
于 2013-05-19T09:23:02.537 回答