首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免重复记录- HashSet

避免重复记录- HashSet
EN

Stack Overflow用户
提问于 2013-05-19 17:21:26
回答 3查看 6.8K关注 0票数 1

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

代码片段-

代码语言:javascript
运行
复制
....

ArrayList list = new ArrayList();

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

return new ArrayList(new HashSet(list));

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

EN

回答 3

Stack Overflow用户

发布于 2013-05-19 18:04:23

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-05-20 12:23:19

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

让我们以car为例,它有两个字段: type和color。如果两个对象具有相同的类型和颜色,则它们将被视为相等。

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

代码语言:javascript
运行
复制
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如何比较对象。

代码语言:javascript
运行
复制
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来帮助您解决这些问题。

希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2013-05-19 17:23:03

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

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

代码语言:javascript
运行
复制
Set list = new HashSet();

for( .... ){ 
    Class factory = DTO.getClass();
    Object bean = factory.newInstance();
    list.add(bean);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16633149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档