我正在尝试通过一个for循环将多个DTO对象放到一个ArrayList中。添加所有对象后,为了避免重复,我将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有重复项,我想避免。
发布于 2013-05-19 18:04:23
即使DTO的两个实例包含完全相同的值,HashSet也会将它们视为不同的值。要被视为相等,dto1.equals(dto2) (和dto2.equals(dto1))必须返回true。因此,您必须覆盖DTO中的Object.equals()方法,以便指定两个DTO实例何时相等。当你覆盖equals()的时候,你也必须覆盖hashCode()。两个相等的对象必须具有相同的hashCode。
阅读这两个方法的文档,如果您不知道如何实现这两个方法,请使用IDE生成这两个方法。
发布于 2013-05-20 12:23:19
您需要覆盖从Object继承的equals和hashcode方法。Java不知道这两个对象是否相等,除非您告诉它要比较什么。Hashset类将调用对象的equals方法进行比较
让我们以car为例,它有两个字段: type和color。如果两个对象具有相同的类型和颜色,则它们将被视为相等。
如果我们不覆盖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
}}
在本例中,我们将通过重写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的对象的哈希集,你会在它们的类中都有两个类,因为java认为它们是不同的对象,因为equals返回false。使用重写的方法测试它,您将只有一个
同样,每当你重写equals的时候,你也应该重写hashCode。使用您最喜欢的IDE来帮助您解决这些问题。
希望这能有所帮助!
发布于 2013-05-19 17:23:03
您应该直接使用接口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);
}https://stackoverflow.com/questions/16633149
复制相似问题