`
lc52520
  • 浏览: 369236 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java hashCode()方法【Z】

    博客分类:
  • java
阅读更多
1. 何时需要重写 equals()
当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。
2. 设计 equals()
[1] 使用 instanceof 操作符检查“实参是否为正确的类型”。
[2] 对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。
[2.1] 对于非 float double 类型的原语类型域,使用 == 比较;
[2.2] 对于对象引用域,递归调用 equals 方法;
[2.3] 对于 float 域,使用 Float.floatToIntBits ( afloat ) 转换为 int ,再使用 == 比较;
[2.4] 对于 double 域,使用 Double.doubleToLongBits ( adouble ) 转换为 int ,再使用 == 比较;
[2.5] 对于数组域,调用 Arrays.equals 方法。
3. 当改写 equals() 的时候,总是要改写 hashCode()
根据一个类的 equals 方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据 Object.hashCode 方法,它们仅仅是两个对象。因此,违反了“相等的对象必须具有相等的散列码”。
4. 设计 hashCode()
[1] 把某个非零常数值,例如 17 ,保存在 int 变量 result 中;
[2] 对于对象中每一个关键域 f (指 equals 方法中考虑的每一个域):
[2.1]boolean 型,计算 (f ? 0 : 1);
[2.2]byte,char,short 型,计算 (int);
[2.3]long 型,计算 (int) (f ^ (f>>>32));
[2.4]float 型,计算 Float.floatToIntBits ( afloat ) ;
[2.5]double 型,计算 Double.doubleToLongBits ( adouble ) 得到一个 long ,再执行 [2.3];
[2.6] 对象引用,递归调用它的 hashCode 方法 ;
[2.7] 数组域,对其中每个元素调用它的 hashCode 方法。
[3] 将上面计算得到的散列码保存到 int 变量 c ,然后执行 result=37*result+c;
[4] 返回 result
5. 示例
下面的这个类遵循上面的设计原则,重写了类的 equals() hashCode()
package com.zj.unit;
import java.util.Arrays;
 
public class Unit {
    private short ashort ;
    private char achar ;
    private byte abyte ;
    private boolean abool ;
    private long along ;
    private float afloat ;
    private double adouble ;
    private Unit aObject ;
    private int [] ints ;
    private Unit[] units ;
 
    public boolean equals(Object o) {
       if (!(o instanceof Unit))
           return false ;
       Unit unit = (Unit) o;
       return unit. ashort == ashort
              && unit. achar == achar
              && unit. abyte == abyte
              && unit. abool == abool
              && unit. along == along
              && Float.floatToIntBits (unit. afloat ) == Float
                     .floatToIntBits ( afloat )
              && Double.doubleToLongBits (unit. adouble ) == Double
                     .doubleToLongBits ( adouble )
              && unit. aObject .equals( aObject )
&& equalsInts(unit. ints )
              && equalsUnits(unit. units );
    }
 
    private boolean equalsInts( int [] aints) {
       return Arrays.equals ( ints , aints);
    }
 
    private boolean equalsUnits(Unit[] aUnits) {
       return Arrays.equals ( units , aUnits);
    }
 
    public int hashCode() {
       int result = 17;
       result = 37 * result + ( int ) ashort ;
       result = 37 * result + ( int ) achar ;
       result = 37 * result + ( int ) abyte ;
       result = 37 * result + ( abool ? 0 : 1);
       result = 37 * result + ( int ) ( along ^ ( along >>> 32));
       result = 37 * result + Float.floatToIntBits ( afloat );
       long tolong = Double.doubleToLongBits ( adouble );
       result = 37 * result + ( int ) (tolong ^ (tolong >>> 32));
       result = 37 * result + aObject .hashCode();
       result = 37 * result + intsHashCode( ints );
       result = 37 * result + unitsHashCode( units );
       return result;
    }
 
    private int intsHashCode( int [] aints) {
       int result = 17;
       for ( int i = 0; i < aints. length ; i++)
           result = 37 * result + aints[i];
       return result;
    }
 
    private int unitsHashCode(Unit[] aUnits) {
       int result = 17;
       for ( int i = 0; i < aUnits. length ; i++)
           result = 37 * result + aUnits[i].hashCode();
       return result;
    }
}
分享到:
评论

相关推荐

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

    java 中HashCode重复的可能性

    在 Java 中,每个对象都有一个 Hash Code,它可以通过 hashCode() 方法获取。Hash Code 是一个整数值,它可以用于比较对象的相等性。 那么,Hash Code重复的可能性是从何而来的? Hash Code 重复的可能性来自于 ...

    Java_重写equals()和hashCode()

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

    探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    Java中的equals()和hashCode()方法详解 Java中的equals()和hashCode()方法是两个重要的方法,它们都是从Object类中继承过来的。equals()方法用于比较两个对象的值是否相等,而hashCode()方法用于计算对象的哈希码。...

    如何正确实现Java中的HashCode共6页.pdf.z

    在Java编程语言中,`hashCode()`方法是每个对象都继承自`Object`类的一个关键方法。这个方法的主要目的是为对象生成一个整数哈希码,通常用于存储和检索对象时提高性能,特别是在使用哈希表(如`HashMap`、`HashSet`...

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

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

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

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

    解析Java对象的equals()和hashCode()的使用

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...

    java中hashcode()和equals()的详解.docx

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们主要用于处理对象的唯一标识和对象之间的相等性判断。正确地实现这两个方法对于确保...

    comparing java objects_hashcode_Comparing_

    `hashCode()`方法是每个Java对象的成员,继承自`Object`类。当对象被用作哈希表(如HashMap或HashSet)中的键时,哈希码用于定位对象在表中的位置。两个相等的对象(根据`equals()`方法定义)必须具有相同的哈希码,...

    Java equals 方法与hashcode 方法的深入解析

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的概念,尤其是在对象比较和数据结构(如哈希表)中。`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则与对象的哈希值有关,这...

    java 基础之(equals hashcode)

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 和 `HashSet`)时。`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于...

    hashcode和equals的分析

    在深入探讨`hashCode`方法之前,我们需要了解Java集合框架的基本概念。Java集合框架主要包括两大类集合:`List`和`Set`。 - **List**:这是一个有序集合,允许元素重复。 - **Set**:这是一个不允许元素重复的无序...

    Java中的equals()和hashCode()契约Ja

    在Java编程语言中,`equals()`和`hashCode()`方法是两个至关重要的概念,它们与对象的比较和哈希表操作紧密相关。理解这两个方法的工作原理及其契约是成为一名熟练的Java开发者所必需的。 首先,`equals()`方法是...

    Java中equals方法隐藏的陷阱

    ### Java中equals方法隐藏的陷阱 在Java编程中,正确实现`equals`方法至关重要,它不仅影响对象的比较逻辑,还直接关系到集合类(如`HashSet`、`HashMap`等)的行为。本文将深入探讨Java中`equals`方法的一些常见...

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

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

    hashcode代码

    在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,它们主要用于对象的比较和哈希表操作。这两个方法在处理自定义类时尤其重要,因为它们直接影响到对象的比较逻辑和存储效率。 `hashCode()...

Global site tag (gtag.js) - Google Analytics