`
Neil_yang
  • 浏览: 130065 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

对hashCode的一点简单认识

    博客分类:
  • JAVA
阅读更多

hashcode,一个不太好理解,也常被我们忽视的一个概念。然而,hashcode还有对我们有用的东西。
java给我们提供了两种判断对象对等的方式。如果我们判断两个对象是否相等,那么直接用“==”运算就可以了。然而,判断两个对象对等,就没有那么简单了。
在java中,我们常常通过equals()方法来判断两个对象的对等。其实,我么还可以通过hashCode()来判断两个对象的对等。

看下面的例子:

import java.util.List;

public class MyBag{
    float money;
    List books;  
}
我们如何判断两个MyBag对象是对等的呢?也就是说,如果有两个MyBag的对象bag1和bag2,通过什么的办法能说明这个两个对象是相同的呢?
先声名两个概念:
两个对象相等,指的是,两个引用指向了同一个对象,也就是说,指向了内存中的同一个地址。
两个对象相同(对等),指得是两个对象的任何属性都相等,但是,不是一个对象。

所以,对于上面的MyBag的对象对等,那么,两个对象的money要一样,同时,books要对等。那么如何去判断呢?我们通常会自己去实现equals()方法去判断,方法如下:

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final MyBag other = (MyBag) obj;
        if (books == null) {
            if (other.books != null)
                return false;
        } else if (!books.equals(other.books))
            return false;
        if (Float.floatToIntBits(money) != Float.floatToIntBits(other.money))
            return false;
        return true;
    }

我们也可以通过实现hashCode()来实现:
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((books == null) ? 0 : books.hashCode());
        result = prime * result + Float.floatToIntBits(money);
        return result;
    }

那么我们判断两个对象对等时,就可以这样来实现了:
if(bag1.equals(bag2)){
    // 对等
}

或者
if(bag1.haseCode()==bag2.hashCode()){
    // 对等
}

为什么这种方式也能判断两个对象对等呢?
因为,任何一个对象的hashCode是唯一的,并且和气对象属性按照一定的规则相关的。

比如,一个Integer的hashCode值就是其整数值,因为Integer的haseCode()是这样实现的:
    public int hashCode() {
        return value;
    }
    public boolean equals(Object obj) {
        if (obj instanceof Integer)
            return value == ((Integer) obj).intValue();
        else
            return false;
    }

由此可以看到,也对象的HashCode是和其属性有一定的联系,规则和属性的值有一定的联系,这个规则决定了有相同的hashcode,就有两个对象的属性对等。

http://www.blogjava.net/zhyiwww/archive/2008/04/22/194845.html

分享到:
评论

相关推荐

    HashCode的用法详解

    下面我们将对 hashCode 的用法进行详细的解释。 hashCode 的作用 hashCode 的主要作用是用于查找和排序。在查找和排序的过程中,我们需要快速地定位到目标对象,而 hashCode 正是这个过程的关键。例如,在内存中有...

    深入 HashCode 方法~

    简单来说,`HashCode` 是一个整数值,用于快速定位对象的位置。在 Java 中,每一个对象都有一个默认的 `HashCode`,它是由 Java 虚拟机自动生成的。`HashCode` 在某些数据结构(如哈希表)中的查找效率起着至关重要...

    java中Hashcode的作用.docx

    我们可以通过一个简单的实验来证明这一点。 package com.tools; import java.util.ArrayList; public class HashCodeMeaning { public static void main(String[] args) { ArrayList list = new ArrayList(); ...

    PPT浅析hashcode

    PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的

    深入HashCode

    例如,如果对象有一个`id`属性,可以简单地返回`id`的值。如果有多个属性,可以将它们的哈希码组合起来,比如使用位操作(如异或、按位与等)或者乘法。 四、`hashCode()`的局限性和优化 尽管`hashCode()`提供了...

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

    以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。默认情况下,`equals()` 检查两个对象是否是同一个对象(即内存地址是否...

    equals与hashCode方法讲解

    在 HashMap 的 Node 类中,hashCode 方法的实现是根据键值对的键和值来计算哈希码。 public final int hashCode() { return Objects.hashCode(key) ^ Objects.hashCode(value); } equals 方法和 hashCode 方法都...

    hashCode的作用

    ### hashCode的作用 在Java编程语言中,`hashCode`方法是一个重要的概念,主要用于对象的查找与存储,尤其是在集合框架中有着广泛...在实际开发中,应当注意对这两个方法的合理使用和重写,以满足具体应用场景的需求。

    hashcode的作用

    ### HashCode的作用详解 #### 一、HashCode的基本概念 在Java中,`hashCode()` 方法是 `Object` 类的一个重要成员方法,它返回一个整数,这个整数通常用来表示对象的哈希值。哈希值在Java集合框架中扮演着至关重要...

    hashcode、equals、==总结1简单总结.txt

    hashcode、equals、==总结1简单总结.txt,他们之间的区别

    hashcode和equals方法

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

    HashCode相同equals不同的2位字符集合算法

    - **hashCode()**: 可以将两个字符的ASCII值进行某种组合,如异或操作,然后对一个较大的质数取模,以减少冲突。这样,即使ASCII值相近的字符,经过哈希运算后也能得到不同的结果。 - **equals()**: 需要检查两个...

    hashCode的理解

    java中hashCode()的理解

    复写hashCode()方法,和equasl()方法

    因此,通常需要对`equals()`方法进行重写以便根据业务逻辑来比较对象是否相等。 #### 实现细节 在上述代码示例中,`Person1`类重写了`equals()`方法: ```java public boolean equals(Object obj) { if (!(obj ...

    关于HashCode码的重复问题 两种验证实例

    1,如果两个对象相同,那么它们的hashCode值一定要相同; 2,如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 3,HashCode码不唯一

    利用反射绕过编译器和hashcode高级应用

    1. 访问私有成员:在Java中,编译器通常会阻止对私有成员的直接访问。然而,通过反射,我们可以使用`java.lang.reflect.Field`和`java.lang.reflect.Method`类来获取并操作这些私有成员。例如,`Field.setAccessible...

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

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

    Java_重写equals()和hashCode()

    当同时重写 `equals()` 和 `hashCode()` 时,需要注意的一点是,如果 `equals()` 返回true,那么两个对象的 `hashCode()` 必须相等。反之则不一定,因为不同的对象可能会产生相同的哈希码。这就是为什么在设计类时,...

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

    在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...

Global site tag (gtag.js) - Google Analytics