比较两个Java对象时, 我们需要覆盖equals和  hashCode。

  1. public class User{
  2. private String name;
  3. private int age;
  4. private String passport;
  5. //getters and setters, constructor
  6. }
 

在比较结果时:

  1. User user1 = new User("mkyong", 35, "111222333");
  2. User user2 = new User("mkyong", 35, "111222333");
  3. System.out.println(user1.equals(user2)); // false

下面我们将介绍几种常用方法:

 

1.经典方式

这种17和31散列码的想法来自经典的Java书籍——《Effective Java》第九条。下面我们来看看是如何实现的...
  1. public class User {
  2. private String name;
  3. private int age;
  4. private String passport;
  5. //getters and setters, constructor
  6. @Override
  7. public boolean equals(Object o) {
  8. if (o == this) return true;
  9. if (!(o instanceof User)) {
  10. return false;
  11. }
  12. User user = (User) o;
  13. return user.name.equals(name) &&
  14. user.age == age &&
  15. user.passport.equals(passport);
  16. }
  17. //Idea from effective Java : Item 9
  18. @Override
  19. public int hashCode() {
  20. int result = 17;
  21. result = 31 * result + name.hashCode();
  22. result = 31 * result + age;
  23. result = 31 * result + passport.hashCode();
  24. return result;
  25. }
  26. }

2.JDK 7

对于JDK7及更新版本,你可以是使用java.util.Objects 来重写 equals 和 hashCode 方法,代码如下
 
  1. import java.util.Objects;
  2. public class User {
  3. private String name;
  4. private int age;
  5. private String passport;
  6. //getters and setters, constructor
  7. @Override
  8. public boolean equals(Object o) {
  9. if (o == this) return true;
  10. if (!(o instanceof User)) {
  11. return false;
  12. }
  13. User user = (User) o;
  14. return age == user.age &&
  15. Objects.equals(name, user.name) &&
  16. Objects.equals(passport, user.passport);
  17. }
  18. @Override
  19. public int hashCode() {
  20. return Objects.hash(name, age, passport);
  21. }
  22. }

3.Apache Commons Lang

或者,您可以使用Apache Commons LangEqualsBuilder 和HashCodeBuilder 方法。代码如下

  1. import org.apache.commons.lang3.builder;
  2. public class User {
  3. private String name;
  4. private int age;
  5. private String passport;
  6. //getters and setters, constructor
  7. @Override
  8. public boolean equals(Object o) {
  9. if (o == this) return true;
  10. if (!(o instanceof User)) {
  11. return false;
  12. }
  13. User user = (User) o;
  14. return new EqualsBuilder()
  15. .append(age, user.age)
  16. .append(name, user.name)
  17. .append(passport, user.passport)
  18. .isEquals();
  19. }
  20. @Override
  21. public int hashCode() {
  22. return new HashCodeBuilder(17, 37)
  23. .append(name)
  24. .append(age)
  25. .append(passport)
  26. .toHashCode();
  27. }
  28. }

最后测试总结:

在使用上述三种任何一种方式都可以到如下结果:
  1. User user1 = new User("mkyong", 35, "111222333");
  2. User user2 = new User("mkyong", 35, "111222333");
  3. System.out.println(user1.equals(user2)); // true</span>

其实后两种都是对于17和31散列码思想的封装实现。具体请参考《Effective Java》第九条。

如何正确的重写equals() 和 hashCode()方法的更多相关文章

  1. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

  2. 为什么要重写equals和hashcode方法

    equals hashcode  当新建一个java类时,需要重写equals和hashcode方法,大家都知道!但是,为什么要重写呢? 需要保证对象调用equals方法为true时,hashcode ...

  3. 【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

    原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http ...

  4. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

    1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象 ...

  5. java重写equals和hashCode方法

    一.重写equals方法 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等. 利用equals比较八大包装对象(如int,f ...

  6. 内存泄漏避雷!你真的了解重写equals()和hashcode()方法的原因吗?

    基本概念 要比较两个对象是否相等时需要调用对象的equals() 方法: 判断对象引用所指向的对象地址是否相等 对象地址相等时, 那么对象相关的数据也相等,包括: 对象句柄 对象头 对象实例数据 对象 ...

  7. 重写equals()与hashCode()方法

    出自:http://blog.csdn.net/renfufei/article/details/16339351 Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Oj ...

  8. 重写equals() 和 hashCode()方法

    什么情况下需要重写呢? 比如去重操作时, 有时候往Set集合存放对象User,我们User类的字段太多时,比如有50个字段, 判断两个User对象相同,不需要判断它们所有字段都相同,只需要判断它们的某 ...

  9. List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)

    1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...

随机推荐

  1. Liability

    Liability li·a·bil·i·ty  ˌlīəˈbilədē/   noun A person or thing whose presence or behavior is likely ...

  2. 转:如何编译delta3d

    回头看,自上学以来,做虚拟现实.三维地理信息系统已有六个年头.为了节省花费在编码上的精力,编程应用的API函数也由opengl变成了OpenSceneGraph,但还是花费了很多气力,为了更好的提高开 ...

  3. 【php+js】用PHP或者JS怎么显示搜索到的关键字高亮,及其文章里包含关键字的一小段

    1.想要实现的效果: 2.思路:小数据量使用 php的正则替换,即[preg_replace()]函数 -->> 支持多个关键词高亮显示,中间参数1和参数2放入对应的数组即可. $titl ...

  4. 有可能挑战Java优势的四种技术

    2012-02-22  Java是一种杰出的产业开发语言,这是因为它带来了伟大的统一和对事实上以前并不存在的重要标准的关注.但是和所有语言一样,Java将来也会褪色.依据我做的超越Java的研究,一个 ...

  5. 蓝牙进阶之路 (001) - HC-05蓝牙无线模块设置

    USB转串口的有线转接方式,实在太难看了,尤其是寻接头,那是相当的不方便.其它电器厂商都想把是接头做小,做精致,唯独串口接头还是那么庞大,感觉应该换一换了,都已经完全不符合这个时代的审美观了. 于是, ...

  6. ROS学习(十)—— 使用rosed编辑ROS中的文件

    一.rosed 1.作用: 直接编辑一个文件而不需要打开完整路径名 2.语法: rosed [package_name] [filename] 3.如果不知道编译哪个文件名,可以使用tab进行查询 r ...

  7. 【HTML】前端性能优化之CDN和WPO的比较

    CDN通过将资源存储在更接近用户的位置,缩短到服务器的往返行程,加快页面加载时间来解决性能问题.WPO解决方案,如Radware的FastView,则在前端进行性能提升处理,使页面更有效地呈现在浏览器 ...

  8. block(四)揭开神秘面纱(下)-b

    看此篇时,请大家同时打开两个网址(或者下载它们到本地然后打开): http://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/BlocksRuntim ...

  9. 代码管理(四)SVN和Git对比

    在日常运维工作中,经常会用到版本控制系统,目前用到最广泛的版本控制器就是SVN和Git,那么这两者之间有什么不同之处呢?SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版 ...

  10. Xcode 常用插件

    1.Xcode 插件 从 Xcode 8 起 Apple 禁用 Xcode 插件. 1)Xcode 插件安装目录 ~/library/Application Support/Developer/Sha ...