如何正确的重写equals() 和 hashCode()方法
比较两个Java对象时, 我们需要覆盖equals和 hashCode。
- public class User{
- private String name;
- private int age;
- private String passport;
- //getters and setters, constructor
- }
在比较结果时:
- User user1 = new User("mkyong", 35, "111222333");
- User user2 = new User("mkyong", 35, "111222333");
- System.out.println(user1.equals(user2)); // false
下面我们将介绍几种常用方法:
1.经典方式
- public class User {
- private String name;
- private int age;
- private String passport;
- //getters and setters, constructor
- @Override
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof User)) {
- return false;
- }
- User user = (User) o;
- return user.name.equals(name) &&
- user.age == age &&
- user.passport.equals(passport);
- }
- //Idea from effective Java : Item 9
- @Override
- public int hashCode() {
- int result = 17;
- result = 31 * result + name.hashCode();
- result = 31 * result + age;
- result = 31 * result + passport.hashCode();
- return result;
- }
- }
2.JDK 7
java.util.Objects 来重写 equals 和 hashCode 方法,代码如下- import java.util.Objects;
- public class User {
- private String name;
- private int age;
- private String passport;
- //getters and setters, constructor
- @Override
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof User)) {
- return false;
- }
- User user = (User) o;
- return age == user.age &&
- Objects.equals(name, user.name) &&
- Objects.equals(passport, user.passport);
- }
- @Override
- public int hashCode() {
- return Objects.hash(name, age, passport);
- }
- }
3.Apache Commons Lang
或者,您可以使用Apache Commons LangEqualsBuilder 和HashCodeBuilder 方法。代码如下
- import org.apache.commons.lang3.builder;
- public class User {
- private String name;
- private int age;
- private String passport;
- //getters and setters, constructor
- @Override
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof User)) {
- return false;
- }
- User user = (User) o;
- return new EqualsBuilder()
- .append(age, user.age)
- .append(name, user.name)
- .append(passport, user.passport)
- .isEquals();
- }
- @Override
- public int hashCode() {
- return new HashCodeBuilder(17, 37)
- .append(name)
- .append(age)
- .append(passport)
- .toHashCode();
- }
- }
最后测试总结:
- User user1 = new User("mkyong", 35, "111222333");
- User user2 = new User("mkyong", 35, "111222333");
- System.out.println(user1.equals(user2)); // true</span>
其实后两种都是对于17和31散列码思想的封装实现。具体请参考《Effective Java》第九条。
如何正确的重写equals() 和 hashCode()方法的更多相关文章
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- 为什么要重写equals和hashcode方法
equals hashcode 当新建一个java类时,需要重写equals和hashcode方法,大家都知道!但是,为什么要重写呢? 需要保证对象调用equals方法为true时,hashcode ...
- 【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例
原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例 部分代码参考http ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例
1.重写equals方法实例 部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象 ...
- java重写equals和hashCode方法
一.重写equals方法 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等. 利用equals比较八大包装对象(如int,f ...
- 内存泄漏避雷!你真的了解重写equals()和hashcode()方法的原因吗?
基本概念 要比较两个对象是否相等时需要调用对象的equals() 方法: 判断对象引用所指向的对象地址是否相等 对象地址相等时, 那么对象相关的数据也相等,包括: 对象句柄 对象头 对象实例数据 对象 ...
- 重写equals()与hashCode()方法
出自:http://blog.csdn.net/renfufei/article/details/16339351 Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Oj ...
- 重写equals() 和 hashCode()方法
什么情况下需要重写呢? 比如去重操作时, 有时候往Set集合存放对象User,我们User类的字段太多时,比如有50个字段, 判断两个User对象相同,不需要判断它们所有字段都相同,只需要判断它们的某 ...
- List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)
1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...
随机推荐
- 八叉树(Octree)
八叉树(Octree)是一种用于描述三维空间的树状数据结构.想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个.再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币 ...
- python之模块ftplib(FTP协议的客户端)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ...
- ArcGIS进行自定义投影转换(重投影)
这里记录一下使用自定义七参数进行投影转换的过程. 1.主动创建自定义地理(坐标)变换 首先在系统工具箱里面选择创建自定义地理(坐标)变换 在弹出的窗口中输入相关参数即可. 转换方法选择COORDINA ...
- Dubbo架构设计详解(转收藏)
转自:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合 ...
- rpm基本命令参考
水可载舟,亦可覆舟! 1. 介绍 在Linux操作系统中,常用的软件有RPM包软件包,src.rpm格式的软件包(源码),以源代码发布的软件包以及.bin格式软件包和绿色软件.如果采用.rpm格式的软 ...
- API返回错误信息的最佳实践
使用HTTP Status区分不同消息返回 最基础的三个状态200 OK, 400 Client Error, 500 Server Error 这些应该是够的, 如果客户端可以处理更细的划分, 可以 ...
- 【C++】atoi与stoi
stoi函数默认要求输入的参数字符串是符合int范围的[-2147483648, 2147483647],否则会runtime error.atoi函数则不做范围检查,若超过int范围,则显示-214 ...
- Redis 学习之路 (010) - redis命令手册
Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...
- C链表的简单案例
此案例只是简单的使用链表 链表的特点: 1.不需要提前知道要存入数据的长度 2.最后结点为NULL 3.头结点指向下一个结点的结构体指针 #include <stdio.h> #inclu ...
- Entity Framework之深入分析
EF虽然是一个晚生畸形的ORM框架,但功能强大又具有灵活性的,给了开发人员一定的发挥空间.因为微软出发点总是好的,让开发变得简单,但实际上不是所有的事情都这么理想.这里顺便推荐马丁大叔的书<企业 ...