`
zzhonghe
  • 浏览: 248154 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于类的equals和hashcode方法

    博客分类:
  • Java
阅读更多
当我们想要改写equals方法的时候,总是应该打起12分的精神,不然稍不留神,就能跑出来一些让你抓狂的错误。

先看个例子:

package general;


import static java.lang.System.out;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class TestEffective {

    public static void testEqualsValue() {
        PhoneNumber a = new PhoneNumber(755, 4397681, "calvin");
        PhoneNumber c = new PhoneNumber(755, 4397681, "calvin");
        out.println(a.equals(c));

        Set s = new HashSet();
        s.add(a);
        s.add(c);
        out.println(s.size());

        HashMap<PhoneNumber, String> h = new HashMap<PhoneNumber, String>();
        h.put(new PhoneNumber(755, 4397681, "calvin"), "my number");
        out.println(h.get(new PhoneNumber(755, 4397681, "calvin")));
    }

    public static void main(String args[]) {
        testEqualsValue();
    }
}

class PhoneNumber {
    int area;
    int number;
    String name;

    public PhoneNumber(int area, int number, String name) {
        super();
        this.area = area;
        this.number = number;
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof PhoneNumber)) {
            return false;
        }
        
        PhoneNumber oPhone = (PhoneNumber) obj;
        if (this.area == oPhone.area
                && this.number == oPhone.number
                && (oPhone.name == null ? this.name == null : this.name
                        .equals(oPhone.name))) {
            return true;
        } else {
            return false;
        }
    }

    // @Override
    // public int hashCode() {
    // int result=17;
    // result=37*result+area;
    // result=37*result+number;
    // return result;
    // }

}



粗略一看,结果应该打出, true, 1, "my number"

而实际运行结果确是  true, 2, null

其原因在于违反了改写equals的规则,需要同时也改写hashcode方法。

总体来说,改写equals的时候,需要默念的几条规则如下:

1. 如果equals的对象的引用指向相同,为节省效率,直接返回ture
2. 如果equals的对象是null,那么直接放回false
3. 如果类型不同,直接返回false
4. 如果类型相同而且各个值也相等,值域比较考虑Null值,返回true
5. 同时也改写hashcode方法,设定一个足够散的值


最后,再检查一遍,

a等于b, 那么是否b也等于a
a等于b, b等于c,那么a也等于c
a等于b, 是否不管执行多少便,都是true,是否依赖外界环境

分享到:
评论

相关推荐

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    equals与hashCode方法讲解

    equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...

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

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

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

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    equals,hashcode,toString

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

    Java中的equals和hashCode方法详解1

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

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

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    Java中equals,hashcode和==的区别

    通常情况下,hashcode 方法需要和 equals 方法一起使用,以确保两个对象的散列码相同,如果它们的内容相同。 例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,...

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

    其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,本文将详细介绍这两个方法,并结合ArrayList、Vector和LinkedList三个常见的容器集合。 一、equals方法 equals方法是Java中用于比较两个对象是否...

    java中hashcode()和equals()方法详解

    在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...

    深入理解equals和hashCode方法

    equals和hashCode方法是Java中Object类提供的两个重要方法,对以后的学习有很大的帮助。本文将深入剖析这两个方法,帮助读者更好地理解和使用它们。 equals方法 equals方法是用于比较两个对象是否相同的方法。它是...

    关于hashCode()和equals()的本质区别和联系

    本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些方法。 hashCode() 方法 hashCode() 方法是 Object 类中的一个方法,它返回对象的哈希码值。哈希码值是一个整数,它...

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

    Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将详细地介绍Java重写equals及hashCode方法的...

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

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

    equals 和 hashCode两者效果分析详解.docx

    在Java编程语言中,`equals()`和`hashCode()`方法是两个非常重要的概念,尤其是在处理对象比较和容器(如HashMap和HashSet)操作时。这两个方法在Java的类库中有着核心地位,尤其是对于类实例的比较和存储。接下来,...

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

    Object 类的 equals 和 hashCode 方法的重要性与实现 在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    set接口经常用的hashCode和equals方法详解

    假设我们有一个自定义类`Person`,我们需要为其实现`hashCode`和`equals`方法: ```java public class Person { private String name; private int age; // 构造函数和其他方法省略... @Override public ...

Global site tag (gtag.js) - Google Analytics