`
cheng198412
  • 浏览: 3007 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何正确的重写equals() 和 hashCode()方法

 
阅读更多

本文将介绍在java中如何重写equals 和hashCode方法。

---译自:http://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/

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

[java] view plain copy
 
  1. public class User{      
  2.     private String name;  
  3.     private int age;  
  4.     private String passport;  
  5.   
  6.     //getters and setters, constructor  
  7. }  
 

在比较结果时:

[java] view plain copy
 
  1. User user1 = new User("mkyong"35"111222333");  
  2. User user2 = new User("mkyong"35"111222333");  
  3.   
  4. System.out.println(user1.equals(user2)); // false  


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

 

 1.经典方式

 
这种17和31散列码的想法来自经典的Java书籍——《Effective Java》第九条。下面我们来看看是如何实现的...
[java] view plain copy
 
  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 == thisreturn 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 方法,代码如下
 
[java] view plain copy
 
  1. import java.util.Objects;  
  2.   
  3. public class User {  
  4.     private String name;  
  5.     private int age;  
  6.     private String passport;  
  7.   
  8.     //getters and setters, constructor  
  9.   
  10.     @Override  
  11.     public boolean equals(Object o) {  
  12.         if (o == thisreturn true;  
  13.         if (!(o instanceof User)) {  
  14.             return false;  
  15.         }  
  16.         User user = (User) o;  
  17.         return age == user.age &&  
  18.                 Objects.equals(name, user.name) &&  
  19.                 Objects.equals(passport, user.passport);  
  20.     }  
  21.   
  22.     @Override  
  23.     public int hashCode() {  
  24.         return Objects.hash(name, age, passport);  
  25.     }  
  26.   
  27. }  

3.Apache Commons Lang

或者,您可以使用Apache Commons LangEqualsBuilder HashCodeBuilder 方法。代码如下
[java] view plain copy
 
  1. import org.apache.commons.lang3.builder;  
  2.   
  3. public class User {  
  4.     private String name;  
  5.     private int age;  
  6.     private String passport;  
  7.     //getters and setters, constructor  
  8.   
  9.      @Override  
  10.     public boolean equals(Object o) {  
  11.   
  12.         if (o == thisreturn true;  
  13.         if (!(o instanceof User)) {  
  14.             return false;  
  15.         }  
  16.         User user = (User) o;  
  17.   
  18.         return new EqualsBuilder()  
  19.                 .append(age, user.age)  
  20.                 .append(name, user.name)  
  21.                 .append(passport, user.passport)  
  22.                 .isEquals();  
  23.     }  
  24.     @Override  
  25.     public int hashCode() {  
  26.         return new HashCodeBuilder(1737)  
  27.                 .append(name)  
  28.                 .append(age)  
  29.                 .append(passport)  
  30.                 .toHashCode();  
  31.     }  
  32. }  

最后测试总结:

在使用上述三种任何一种方式都可以到如下结果:
[java] view plain copy
 
  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方法_equals_重写equals和hashcode方法_

    总的来说,理解并正确地重写 `equals()` 和 `hashCode()` 方法是Java编程中的基础技能,它有助于确保对象的比较和集合操作的正确性。在开发过程中,要时刻注意这两个方法的正确实现,以提高代码质量和可维护性。

    关于重写equals,hashcode以及compareTo方法!

    重写equals()、hashcode()和compareTo()方法是非常重要的,它可以使我们的程序更加高效、可靠和灵活。在实际开发中,我们需要根据具体情况来决定是否需要重写这些方法,并遵守相关的规则,以避免出现意想不到的结果...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    Java重写equals及hashcode方法流程解析

    在实际开发中,我们经常需要重写equals和hashCode方法,以便于正确地比较和存储对象。下面是一个简单的示例代码: public class Student { private String name; private int age; private String QQ; @...

    Java_重写equals()和hashCode()

    总之,理解并正确重写 `equals()` 和 `hashCode()` 方法对于编写高质量的Java代码至关重要,这直接影响到对象比较的逻辑以及使用哈希表的数据结构的效率。通过遵循上述原则和最佳实践,我们可以确保对象的比较行为...

    equals与hashCode在实际开发中的重写写法

    在 TestEqualsHashCode.java 文件中,通常会包含一个示例,演示如何正确地重写 `equals()` 和 `hashCode()` 方法。这个文件可能包含一个自定义类,并展示如何根据类的属性定义这两个方法,以实现特定的比较逻辑。 ...

    学习Object类——为什么要重写equeals和hashcode方法

    在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而不是内存地址。下面我们将详细地解释为什么需要重写这...

    重写equals方法

    例如,public boolean equals(Object o) 是一个正确的重写方法,而 public boolean equals(String o) 是一个重载方法,而不是重写方法。 equals 方法的实现 ------------------------- equals 方法的实现需要遵循...

    equals与hashCode方法讲解

    equals 与 hashCode 方法讲解 equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的...在实际开发中,我们需要根据具体情况来重写这两个方法,以确保对象的正确比较和哈希码计算。

    关于Object中equals方法和hashCode方法判断的分析

    下面是一个简单的示例代码,演示了如何重写 equals 和 hashCode 方法: ```java public class Person { @Override public boolean equals(Object obj) { System.out.println("判断 Person 的 equals"); return ...

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    【面试】中提到的几个关键知识点集中在对象比较、equals()和hashCode()方法的使用以及它们之间的关系上。这些概念在Java编程中至关重要,特别是在处理集合类和比较对象时。 1、**hashCode与equals两者之间的关系**...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    在 Java 中,重写 equals() 方法和 hashCode() 方法是非常重要的,它们可以确保对象的比较和标识正确。如果我们违反了这两个方法的规则,那么可能会产生理解的不一致。因此,在编写 Java 代码时,需要严格遵守这两个...

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

    equals,hashcode,toString

    在这个类中,很可能已经重写了`equals()`, `hashCode()` 和 `toString()` 方法,以便更好地处理对象的比较、哈希存储和输出信息。 为了实现`DBObject`类的正确行为,开发者可能考虑了以下几点: 1. 在`equals()`...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    重写hashCode()和equals()方法详细介绍

    如果我们重写了`equals()`方法来基于`name`和`age`判断两个`Coder`对象是否相等,那么我们也应该重写`hashCode()`,使具有相同`name`和`age`的`Coder`对象产生相同的哈希码。通常,`hashCode()`的实现会结合所有参与...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    重写equals方法需要遵守通用约定,hashCode方法的实现需要保证equals相同的两个对象的hashCode结果一致。ArrayList、Vector和LinkedList是Java中三种常见的容器集合,每种集合都有其特点和应用场景。

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    为什么在重写 equals方法的同时必须重写 hashcode方法

    总之,重写 `equals` 和 `hashCode` 方法是保证自定义对象在集合中正确比较和存储的关键。这样做不仅可以满足特定的业务需求,还能确保集合操作的正确性和效率。在实现类时,应始终注意这两个方法的配合使用,以遵循...

    深入理解equals和hashCode方法

    深入理解equals和hashCode方法 equals和hashCode方法是Java中...equals和hashCode方法是Java中两个非常重要的方法,它们之间存在紧密的关系,我们需要遵守一定的规则来重写这些方法,以保证对象的正确性和一致性。

Global site tag (gtag.js) - Google Analytics