`

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
分享到:
评论

相关推荐

    java中Hashcode的作用.docx

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

    Java中equals,hashcode和==的区别

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

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

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

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

    在Java编程语言中,`hashCode()`...以上就是关于Java中`hashCode()`和`equals()`的详解。这两个方法在Java编程中起着至关重要的作用,尤其是在处理集合类和数据结构时。了解并正确使用它们能够确保程序的正确性和效率。

    java中hashcode和equals的详解.pdf

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

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

    在 Java 中,有很多类忽略了 hashCode() 和 equals() 方法的默认实现,以便提供更深层次的语义可比性。例如,Integer 类重写了 equals() 方法,使得两个 Integer 对象可以根据其整数值进行比较。这种基于值的 Equal ...

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

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

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

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

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

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

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

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

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

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

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

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

    深入理解Java中HashCode方法

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

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

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

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

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

    Java_重写equals()和hashCode()

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

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

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

Global site tag (gtag.js) - Google Analytics