HashSet判断加入的对象是否重复的原理:
对于Set接口的实现类HashSet,它是按照哈希算法来存取集合中的对象,并且因为其继承了Set接口,所以不允许插入相同的数据。那么它如何来保证不插入相同的数据,这就要使用到equals()和hashCode()方法了。在我们往HashSet里面添加对象(add()方法里的参数都是对象)的时候,在Add()的方法内部,它首先调用该对象的hashCode()方法(hashCode方法用来计算该对象的哈希码),如果返回的哈希码与集合已存在对象的哈希码不一致,则add()方法认定该对象没有与集合中的其它对象重复,那么该对象将被添加进集合中。如果hashCode()方法返回的哈希码与集合已存在对象的哈希码一致,那么将调用该对象的equals方法,进一步判断两个对象是否相等。之所以在进行了hashcode(哈希码)的比较后,又调用equals()方法进行比较,是因为虽然HashSet采用的是通过hashcode来区分对象,但是在java中hashcode会重码(即不同的对象,其hashcode可能会相同)
在hibernate中,为什么要实体类重写这两个方法?
a.一般实体类是多的一方
b.判断这样的两个对象是相等的,不让它们重复加入
如:有一个类
public class Comment {
/**
* @param args
*/
private Long id ;
private String name ; //comment 人的名字
private Date createDate ;
private String content;
public Comment(String name,Date createDate,String content) {
this.name=name;
this.createDate =createDate;
this.content = content;
}
根据需求,不允许这样的对象添加到hashset中,只允许一个
Comment d1 = new Comment("wind",date,"abbb");
Comment d2 = new Comment("wind",date,"abbb");
Comment d3 = new Comment("wind",date,"ab");
在类中重写方法就行了,如下
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj)
{
return true;
}
if (!(obj instanceof Comment)) {
return false;
}
Comment other = (Comment) obj;
if (getName()!=null && getName() .equals(other.getName())&& getCreateDate()!=null && getCreateDate().equals(other.getCreateDate())) {
return true;
} else {
return false;
}
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((getName() == null) ? 0 : getName().hashCode());
result = PRIME * result + ((getCreateDate() == null) ? 0 : getCreateDate().hashCode());
return result;
}
选择那个属性进行比较,要看你的系统的业务需求,一定要从业务需求里找比较属性
为什么要选择name 和 createDate 这两个属性,在这里我们假设有这样一个业务,有一个人在某个时间写了评论,评论是Comment类,name 是这个人的名字,写作时间是createDate ,这两个的组合一定是唯一的,一个人不可能在同一个时间写下两篇文章,我们就选这样的组合做为比较,这样才符合业务的需求。
测试代码:
Set s = new HashSet();
Date date = RefleshActionHelper.FormatDate("2004-05-09", "yyyy-mm-dd");
Comment d1 = new Comment("wind",date,"abbb");
Comment d2 = new Comment("wind",date,"abbb");
s.add(d1);
s.add(d2);
System.out.println(d1.hashCode()+" "+d2.hashCode());
Iterator it =s.iterator();
while (it.hasNext()){
Comment t= (Comment)it.next();
System.out.println(t.getName());
}
结果是只添加了一个
上面比较的都是对象,如果比较基本类型呢,如,一个int count;我们在hashCode() 里这样写,基本类型是不能获得hashCode()方法的,直接加它的属性值就行了
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + count
result = PRIME * result + ((getCreateDate() == null) ? 0 : getCreateDate().hashCode());
return result;
}
分享到:
相关推荐
一个实现Hibernate复合主键方法的equals,hashCode方法的类包
它必须重新实现equals()和hashCode()方法, 始终和组合关键字在数据库中的概念保持一致 注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合...
第三、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并要重写equals和hashcode.最后在主类中(该类包含联合主键类中的字段)将联合主键字段都注解为@Id,并在该类上方将上这样的注解:@Id...
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射
将JSON列类型映射到List或Map<String> ,需要确保POJO类型覆盖默认的equals和hashCode方法,并根据JSON对象的内容实现它们。 否则,Hibernate脏检查机制可能会触发意外的UPDATE语句。 查看。 Oracle 您应该使用...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. ...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...
实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...
5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. ...
5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...
实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...
4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...
整个层次结构中的所有父类和子类属性都映射到同一个表中,他们的实例通过一个辨别符列(discriminator)来区分。 Plane 是父类。@DiscriminatorColumn 注解定义了辨别符列。对于继承层次结构中的每个类, @...
"=="和equals方法究竟有什么区别 String,StringBuffer,StringBuilder有什么区别 java中的数组是不是对象 数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的...
5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...