hashCode()方法与equals()方法的说明

1,一般我们自己用时,只使用equals()方法,用于判断两个对象是否是业务上等价的。
2,在重写equals()方法时,强烈推荐也要重写hashCode()方法,因为有的集合用到了hashCode()来提高效率。
equals为true的对象的hashCode值一定要一样。
equals为false的对象的hashCode值尽量不一样。
3,可以使用工具自动生成hashCode()与euqals()方法。

 1 package com.zsy.study;
 2
 3 public class User {
 4     private Integer id;
 5     private String name;
 6     public Integer getId() {
 7         return id;
 8     }
 9     public User(){}
10     public User(Integer id) {
11         super();
12         this.id = id;
13     }
14     public void setId(Integer id) {
15         this.id = id;
16     }
17     public String getName() {
18         return name;
19     }
20     public void setName(String name) {
21         this.name = name;
22     }
23
24 }

测试代码

 1 public class TestEquals {
 2
 3     @Test
 4     public void test() throws Exception {
 5         Set<User> set = new HashSet<User>();
 6
 7         // User user = new User(1);
 8         // set.add(user);
 9         // set.add(user);
10
11         set.add(new User(1));
12         set.add(new User(1));
13         set.add(new User(1));
14
15         System.out.println(set.size());
16     }
17
18     @Test
19     public void test2() throws Exception {
20         System.out.println("aa" == "aa"); // true
21         System.out.println(new String("aa") == new String("aa")); // false
22         System.out.println("aa" == new String("aa")); // false
23
24         System.out.println("aa".equals(new String("aa"))); // true
25     }
26
27     @Test
28     public void test3() throws Exception {
29         Set<User> set = new HashSet<User>();
30
31         User user = new User(); // id = 0
32         set.add(user);
33
34         // session.save(user); // id = 5
35         user.setId(5);
36         set.add(user); // user.hashCode() == eltOldhashCode;
37
38         // set.add(user);
39         System.out.println(set.size());
40     }
41 }

需导入junit.jar 测试类

时间: 2024-10-07 09:46:17

hashCode()方法与equals()方法的说明的相关文章

java为什么要重写hashCode方法和equals方法?

之前发布过一篇文章说的是关于 equals方法重写 http://www.cnblogs.com/aL0n4k/p/4777333.html 下面就hashCode方法发表一下本人的理解,仅供参考,交流. 在 关于java重写equals方法 已经提及说,比较2个对象的时候,要比较他们各自的属性. 那么重写hashCode方法是因为我们在接触到集合的时候,里面有个Set接口,他只能添加无序以及不重复的对象元素. 那有人会问,既然是这样我们直接用equals判断不就完了么? 实际上对Set集合而言

集合类hashCode()方法和equals()方法

1.散列码: Object中的HashCode方法会返回该对象的的内存真实地址的整数化表示,这个形象的不是真正抵制的整数值就是哈希码. 2.利用哈希码向集合中插入数据的顺序? 向HashSet中添加对象时,HashSet先通过该对象的HashCode()计算出相应的桶,然后再根据equals()方法找到相应的对象,如果容器中已存在该对象则不再添加,如果不存在,则添加进去. 3.什么时候重写hashCode()方法?         String和Integer这些Java自带的类都重写了hash

java基础之问题:请说出hashCode方法、equals方法、HashSet、HashMap之间的关系

①HashSet是采用HashMap来实现的:这个HashMap的key就是放进HashSet中的对象,value就是一个Object类型的对象 ②当调用HashSet的add方法时,实际上是想HashMap中增加了一行(key-value对),该行的key就是往HashSet增加的那个对象,该行的value就是一个Object类型的常量. ③HashMap底层采用数组来维护 ④调用增加的那个对象的hashCode方法,来得到一个hashCode,然后根据该值来计算出一个数组的下标索引(计算出数

Java 重写hashCode 方法和equals方法

package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复 |---HashSet:底层数据结构是哈希表 | HashSet是如何保证元素唯一性呢? | 是通过两个方法来完成的 hashCode 和 equals来完成的 | 如果元素的hashCode值相同,才会判断 equals 是否为true | 如果hashCode值不相同,不会调用

跟王老师学集合(九)Java中hashCode方法与equals方法的用法

Java中对象比较 主讲人:王少华  QQ群号:483773664 学习目标: 掌握java中的==.equals().hashCode()的异同 一.问题 通过前面的学习,我们知道,Java集合有三个大的接口,List接口.Map接口.Set接口,这三个接口的特点是List接口中的元素能重复.Map接口中的key对象不能重复,Set接口中的元素是不可以重复的.那么问题来了,两个元素是否重复是根据什么来判断的. 二.Java中两个对象比较 (一).== 1.Java中,比较简单类型变量用"==&

static,final关键字,Object类的tostring方法,equals方法,hashCode方法

1)static关键字 static可以修饰:属性.方法.代码块 静态方法不能访问非静态 属性 或 方法 属性(变量): 成员变量: 静态变量: 通过 类名.静态变量来访问 通过 对象名.静态变量来访问(是有警告的) 存在于方法区中,有且仅有一份 非静态变量 局部变量 代码块 代码块的执行顺序 1.静态代码块:哪个静态代码块放在前边,就先执行谁 2.普通代码块:哪个普通代码块放在前边,就先执行谁 3.构造方法 如果有两个类,一个类是Father,另一个类是Child , Child 继承了 Fa

半夜思考, 为什么建议重写 equals()方法时, 也要重写hashCode()方法

我说的半夜, 并不是真正的半夜, 指的是在我一个人的时候, 我会去思考一些奇怪的问题. 这次思考的如题所示, 为什么重写 equals() 方法时, 强烈建议重写 hashCode() 方法, 这个答案, 应该大多数人都知道, 是为了减少 equals() 方法的调用, 只有当两个对象的 hashCode 相等时, 才会去调用 equals()方法去判断两个对象是否相等, 减少了equals()的调用, 提高了效率 . 话是这么说,  的确, 可以减少很多次的 equals()方法的调用, 但是

Java 中正确使用 hashCode 和 equals 方法

在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hashCode()和equals()的用法 重写默认实现 使用Apache Commons Lang包重写hashCode()和equals() 需要注意记住的事情 当使用ORM的时候特别要注意的 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的jav

对象的比较及hashCode、equals方法的使用

如何进行对象的值的比较呢?如String类型的变量,是靠调用equals方法来比较的,而其它的类似数组或普通的对象直接调用equals方法一般是不可以的,这是因为String类型的变量通过调用equals方法来比较变量是因为String类覆盖了Object的HashCode方法和equals方法.正如String调用equals方法可以比较String对象变量的值是否相等,一般的对象也可以通过覆盖Object类的方法来达到同样的目的的.如下面代码 所示: import java.util.Has