`

Java类中的hashcode

阅读更多
关于hashcode()

  1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有

  例如内存中有这样的位置

  0     1     2     3     4     5     6     7

  而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。

  但如果用hashcode那就会使效率提高很多。
    我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了。

   2.但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义   equals了。

  也就是说,我们先通过   hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过   equals   来在这个桶里找到我们要的类。
  那么。重写了equals(),为什么还要重写hashCode()呢?

  想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊

hashCode()是用来产生哈希玛的,而哈希玛是用来在散列存储结构中确定对象的存储地址的,(这一段在 Java编程思想中讲的很清楚的)象util包中的 带 hash 的集合类都是用这种存储结构 :HashMap,HashSet, 他们在将对象存储时(严格说是对象引用),需要确定他们的地址吧,而HashCode()就是这个用途的,一般都需要重新定义它的,因为默认情况下,由 Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数,这一般是通过将该对象的内部地址转换成一个整数来实现的,现在举个例子来说, 就拿HashSet来说,在将对象存入其中时,通过被存入对象的 hashCode() 来确定对象在 HashSet 中的存储地址,通过equals()来确定存入的对象是否重复,hashCode() ,equals()都需要自己重新定义,因为hashCode()默认前面已经说啦,而equals() 默认是比较的对象引用,你现在想一下,如果你不定义equals()的话,那么同一个类产生的两个内容完全相同的对象都可以存入Set,因为他们是通过 equals()来确定的,这样就使得HashSet 失去了他的意义,看一下下面这个:

import java.util.*;

  /**

  *类说明

  * @author shellfeng E-mail:lsf830804@yahoo.com.cn

  * @version 1.0

  *

  */

  public class Test {

  public static void main(String[] args) {

  HashSet set = new HashSet();

  for (int i = 0; i <= 3; i++){

  set.add(new Demo1(i,i));

  }

  System.out.println(set);

  set.add(new Demo1(1,1));

  System.out.println(set);

  System.out.println(set.contains(new Demo1(0,0)));

  System.out.println(set.add(new Demo1(1,1)));

  System.out.println(set.add(new Demo1(4,4)));

  System.out.println(set);

  }

  private static class Demo1 {

  private int value;

  private int id;

  public Demo1(int value,int id) {

  this.value = value;

  this.id=id;

  }

  public String toString() {

  return " value = " + value;

  }

  public boolean equals(Object o) {

  Demo1 a = (Demo1) o;

  return (a.value == value) ? true : false;

  }

  public int hashCode() {

  return id;

  }

  }

  }

  你分别注释掉hashCode()和 equals()来比较一下他们作用就可以拉,关键要自己动手看看比较的结果你就可以记得很清楚啦

  结果:

  [ value = 2,  value = 1,  value = 3,  value = 0]

  [ value = 2,  value = 1,  value = 3,  value = 0]

  true

  false

  true

  [ value = 2,  value = 4,  value = 1,  value = 3,  value = 0]

  注释掉hashCode()

  [ value = 1,  value = 0,  value = 2,  value = 3]

  [ value = 1,  value = 0,  value = 1,  value = 2,  value = 3]

  false

  true

  true

  [ value = 1,  value = 0,  value = 1,  value = 2,  value = 3,  value = 4,  value = 1]

  注释掉equals()

  [ value = 2,  value = 1,  value = 3,  value = 0]

  [ value = 2,  value = 1,  value = 1,  value = 3,  value = 0]

  false

  true

  true

  [ value = 2,  value = 4,  value = 1,  value = 1,  value = 1,  value = 3,  value = 0]

  hashCode()方法使用来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的桶里面,Map在搜索一个对象的时候先通过hashCode()找到相应的桶,然后再根据equals()方法找到相应的对象.要正确的实现Map里面查找元素必须满足一下两个条件:

   (1)当obj1.equals(obj2)为true时obj1.hashCode() == obj2.hashCode()必须为true

 (2)当obj1.hashCode() == obj2.hashCode()为false时obj.equals(obj2)必须为false
一句话概况:
    当equals为true时,hashCode 必定为true。(equals为false时,hashCode可能为true,也可能为false)
    当hashCode为false时,equals必定为false。(hashCode为true时,equals可能为true,也可能为false)
分享到:
评论

相关推荐

    java中Hashcode的作用.docx

    在Java中,Hashcode的约定是由Java.lang.Object类中的hashCode方法所规定的。这个方法规定了Hashcode的三个基本原则: 1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则...

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

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

    java中hashcode和equals的详解.pdf

    hashCode 方法是 Java 中 Object 类的一个方法,用于返回对象的哈希码值。这个方法的作用是将对象转换为一个整数值,以便于快速地比较和查找对象。在 Java 中,每个对象都有一个独特的哈希码值,这个值可以用来标识...

    深入理解Java中HashCode方法

    Java中的hashCode方法是每个类都需要实现的重要方法之一,它的主要作用是将对象的数据转换为一个32位的整数,用于标识对象的唯一性。在Java的所有类中,Object类是最顶层的父类,它定义了hashCode方法,该方法返回...

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

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

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

    在Java编程语言中,`hashCode()`方法是每个对象都继承自`Object`类的一个关键功能。这个方法的主要目的是为对象生成一个整数哈希码,它通常用于优化数据结构,如哈希表(如`HashMap`和`HashSet`)。本教程“如何正确...

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

    `hashCode()`方法定义于`Object`类中,它是Java语言的基础类,所有Java类都直接或间接地继承自`Object`。`hashCode()`的主要作用在于生成一个整数,这个整数通常用来表示对象的一个哈希值。在Java集合框架中,特别是...

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

    在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们的默认设计就可以了。但是在一些情况下,这两个...

    java 中HashCode重复的可能性

    Java 中HashCode重复的可能性 Java 中的 HashCode 重复可能性是 Java 开发中一个常见的问题。 HashCode 是 Java 中一个重要的概念,它用于标识对象的唯一性。然而,Hash Code 有可能重复,这会导致程序出错。下面...

    Java 中HashCode作用_动力节点Java学院整理

    在 Java 中,HashSet、HashMap 等集合类的实现中,都是通过 HashCode 来实现对象的唯一性和快速查找的。那么,hashCode 是如何工作的呢?当我们向一个集合中添加某个元素时,集合会首先调用 hashCode 方法,这样就...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    `hashCode` 方法是 `Object` 类中的一个方法,用于返回对象的哈希码值。在 Java 中,哈希码经常被用于实现散列表(如 `HashMap` 和 `HashSet`)。为了确保散列表的正确性,重写 `equals` 方法时,通常也需要重写 `...

    Java中equals,hashcode和==的区别

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

    Java_重写equals()和hashCode()

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

    comparing java objects_hashcode_Comparing_

    下面将详细阐述哈希码(hashCode)和比较(Comparing)在Java中的作用以及它们在对象比较中的应用。 首先,哈希码是一个整数值,由对象的内部状态计算得出,通常用于快速查找。`hashCode()`方法是每个Java对象的...

    浅谈Java中的hashcode方法

    在Java的Object类中有一个方法:  public native int hashCode();  根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。  为何Object类需要这样一...

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    在Java编程语言中,ArrayList和HashSet是两种常用的集合类,它们各自有其特性和应用场景。在实际开发中,理解它们的差异以及如何有效地利用它们是非常重要的。本篇将深入探讨ArrayList与HashSet的区别,并分析...

    javascript中实现兼容JAVA的hashCode算法代码分享

    Java中String类的hashCode方法采用特定的算法,即:初始时,哈希码值为0,然后以字符为单位,对于字符串中的每一个字符,都使用31乘以当前哈希码,然后加上当前字符的ASCII值,然后更新哈希码。 2. **JavaScript中...

Global site tag (gtag.js) - Google Analytics