hashset如何删除重复的条目?

时间:2015-09-23 06:21:14

标签: java hibernate collections

public class Type extends SomeObject implements java.io.Serializable {

    private Integer typeId;

    private String typeName;

     private String typeCode;
}

我使用hibernate作为Type对象从数据库获取数据。现在我的班级没有(也不是它的父类)覆盖equals方法。因此,如果我将所有Type对象插入到散列集中,它不应该删除重复项,但它会删除重复项。我的问题是它如何识别重复?

2 个答案:

答案 0 :(得分:3)

在Hibernate会话中,给定实体只存在一次。即如果你这样做

Type type1 = (Type) session.get(Type.class, 42);
Type type2 = (Type) session.get(Type.class, 42);
Type type3 = (Type) session.createQuery("select t from Type t where t.id = 42").uniqueResult();

然后type1type2type3都将引用单个对象。因此,在空HashSet中添加它们将导致大小为1的HashSet,因为Object.equals()在将对象与其自身进行比较时返回true。

答案 1 :(得分:-3)

如果你的类覆盖了hashcode和equals方法,则使用重写的方法,否则使用默认方法,即Object类中的方法。但hashcode和equals用于HashSets,Hashmaps等。

对于默认行为,您可以参考doc

  

类Object的 equals 方法实现了最具辨识力的方法   对象可能的等价关系;也就是说,对于任何非null   引用值x和y,当且仅当x时,此方法返回true   和y指的是同一个对象(x == y的值为true)

     

尽可能合理实用,由 hashCode 方法定义   class Object确实为不同的对象返回不同的整数。 (:此   通常通过转换内部地址来实现   将对象转换为整数,但这种实现技术不是   JavaTM编程语言所要求的。)

添加如何找到重复项:

让我们先看看哈希:
散列用于快速检索数据。基本上,散列函数生成索引值(此索引值通常是指可以存储对象的存储桶),一旦生成此索引值,它就会在该特定存储桶内搜索该对象。
我建议你研究哈希一次

Hashing Wiki

每当我们添加hashset时,使用hashcode方法,它返回一个索引值,该对象存储在该bucket(该索引对应的存储桶)中。 当再次添加相同的对象时,哈希码值将是相同的,因此它引用相同的桶,因为该对象已存在(此处equals方法用于检查对象之间的对等),它不会再次添加



class Data {

public Data(String name) {
    super();
    this.name = name;
}

String name;
}

public class ReadFromFile {

public static void main(String[] args) throws IOException {
    Data s = new Data("yo");
    HashSet<Data> set = new HashSet<>();
    set.add(new Data("hi"));// hi
    set.add(new Data("hi"));// hi but has a different address because a new
                            // object is created
    System.out.println("Size before adding s " + set.size());
    set.add(s);
    set.add(s);// because same object is being added, default hashcode
                // generates same value, as it uses address to generate
                // hashcode
    System.out.println("Size after adding s " + set.size());
}

}


输出
添加s 2之前的大小 添加s 3后的大小