public class Type extends SomeObject implements java.io.Serializable {
private Integer typeId;
private String typeName;
private String typeCode;
}
我使用hibernate作为Type对象从数据库获取数据。现在我的班级没有(也不是它的父类)覆盖equals方法。因此,如果我将所有Type对象插入到散列集中,它不应该删除重复项,但它会删除重复项。我的问题是它如何识别重复?
答案 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();
然后type1
,type2
和type3
都将引用单个对象。因此,在空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编程语言所要求的。)
添加如何找到重复项:
让我们先看看哈希:
散列用于快速检索数据。基本上,散列函数生成索引值(此索引值通常是指可以存储对象的存储桶),一旦生成此索引值,它就会在该特定存储桶内搜索该对象。
我建议你研究哈希一次
每当我们添加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后的大小