我正在尝试通过ArrayList
循环将多个对象DTO转换为for
。添加完所有对象后,为了避免重复,我将ArrayList
转换为HashSet
以避免重复记录。
代码段 -
....
ArrayList list = new ArrayList();
for( .... ){
Class factory = DTO.getClass();
Object bean = factory.newInstance();
list.add(bean);
}
return new ArrayList(new HashSet(list));
但是返回的ArrayList
有重复,我想避免。
答案 0 :(得分:3)
即使DTO的两个实例包含完全相同的值,HashSet也会认为它们不同。为了被认为是平等的,dto1.equals(dto2)
(和dto2.equals(dto1)
)必须返回true。因此,您必须覆盖DTO中的Object.equals()
方法,以指定两个DTO实例何时相等。当您覆盖equals()
时,您还必须覆盖hashCode()
。两个相等的对象必须具有相同的hashCode。
阅读这两种方法的文档,如果您不知道如何实现它们,请使用IDE生成这两种方法。
答案 1 :(得分:3)
您需要覆盖从Object继承的equals和hashcode方法。 Java不知道这两个对象是否相等,除非你告诉它要比较什么。 Hashset类将调用对象的equals方法来进行比较
让我们以汽车为例,它有两个领域;类型和颜色。如果两个对象的类型和颜色相同,则视为相等。
如果我们不覆盖equals方法,当我们有两个相同的
对象时,我们将得到falsepublic 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
}
}
在这个例子中,我们将通过重写equals方法告诉java我们希望它如何比较对象
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
}
运行这个例子你就会成真。
如果你测试带有没有被覆盖的equals的对象的hashset,你将会有两个类,因为java认为它们是不同的对象,因为equals返回false。使用重写方法测试它,你将只有一个
同样,只要你重写equals,你也应该覆盖hashCode。使用您最喜欢的IDE来帮助您解决这些问题。
希望这有帮助!
答案 2 :(得分:-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);
}