以下是关于HashCode的官方文档定义:

hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

以上这段官方文档的定义,我们可以抽出成以下几个关键点:

1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;

2、如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;

3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;

4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。

再归纳一下就是hashCode是用于查找使用的,而equals是用于比较两个对象的是否相等的。以下这段话是从别人帖子回复拷贝过来的:

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()有什么用啊

最后,我们来看一个具体的示例吧,

public classHashTest {private inti;public intgetI() {returni;

}public void setI(inti) {this.i =i;

}public inthashCode() {return i % 10;

}public final static voidmain(String[] args) {

HashTest a= newHashTest();

HashTest b= newHashTest();

a.setI(1);

b.setI(1);

Set set = new HashSet();

set.add(a);

set.add(b);

System.out.println(a.hashCode()==b.hashCode());

System.out.println(a.equals(b));

System.out.println(set);

}

}

这个输出的结果:

true

false

[com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]

以上这个示例,我们只是重写了hashCode方法,从上面的结果可以看出,虽然两个对象的hashCode相等,但是实际上两个对象并不是相等;,我们没有重写equals方法,那么就会调用object默认的equals方法,是比较两个对象的引用是不是相同,显示这是两个不同的对象,两个对象的引用肯定是不定的。这里我们将生成的对象放到了HashSet中,而HashSet中只能够存放唯一的对象,也就是相同的(适用于equals方法)的对象只会存放一个,但是这里实际上是两个对象a,b都被放到了HashSet中,这样HashSet就失去了他本身的意义了。

此时我们把equals方法给加上:

public boolean equals(Object object) {

if (object == null) {

return false;

}

if (object == this) {

return true;

}

if (!(object instanceof HashTest)) {

return false;

}

HashTest other = (HashTest) object;

if (other.getI() == this.getI()) {

return true;

}

return false;

}

此时得到的结果就会如下:

true

true

[com.ubs.sae.test.HashTest@1]

从结果我们可以看出,现在两个对象就完全相等了,HashSet中也只存放了一份对象。

java hashcode在线_java hashcode相关推荐

  1. java hashcode 例子_Java UUID hashCode()用法及代码示例

    Java中UUID类的hashCode()方法通常用于获取UUID的哈希码值. 用法: public int hashCode() 参数:此方法不带任何参数. 返回值:此方法返回一个整数值,该值是此U ...

  2. OC与c混编实现Java的String的hashcode()函数

    首先,我不愿意大家需要用到这篇文章里的代码,因为基本上你就是被坑了. 起因:我被Java后台人员坑了一把,他们要对请求的参数增加一个额外的字段,字段的用途是来校验其余的参数是否再传递过程中被篡改或因为 ...

  3. 深入理解Java的equals和hashCode方法

    1.谈谈equals方法 相信大家对这个这个方法一定不陌生.该方法是Object基类里的非final方法(被设计成可覆盖的),下面我们来看看Object中是如何实现该方法的.源代码如下: public ...

  4. Java:重写equals()和hashCode()

    http://blog.csdn.net/ansel13/article/details/5437486 很基础的东西就是由于没上心,三番五次地出错,这次好好总结下吧. 众所周之,String .Ma ...

  5. Java Byte类的hashCode()方法及示例

    短类hashCode()方法 (Short class hashCode() method) hashCode() method is available in java.lang package. ...

  6. java面试题之hashCode与equals()方法

    @Data @Entity @Table(name = "tb_user") public class User {@Id@GeneratedValue(strategy = Ge ...

  7. Java中的String.hashCode()方法可能有问题?

    过去几天,我一直在浏览Reddit上的一篇文章.这篇文章看得我要抓狂了.文章指出,Java中的String.hashCode()方法(将任意长度的字符串对象映射成32位int值)生成的哈希值存在冲突. ...

  8. java中equals,hashcode和==的区别

    原文地址http://blog.csdn.net/hla199106/article/details/46907725 1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 ...

  9. java基础 equals与hashCode

    Java中equals相关 目录 Java中equals相关 equals()与==的关系 equals()和hashCode() hashCode()介绍 hashCode()的意义 hashCod ...

最新文章

  1. LINUX 上的 Shebang 符号(#!)
  2. 算法设计与分析课程的时间空间复杂度
  3. 16.16. 部分排序
  4. 读书笔记九:TCP/IP详解之广播和多播,IGMP协议
  5. python list存储方式_python list存储
  6. POSIX多线程API函数
  7. 国产统一操作系统(UOS)安装、体验
  8. python数据论文_如何利用Python绘制学术论文图表
  9. mysql多条件查询_excel用字典处理多条件查询问题
  10. 在C语言中如何高效地复制和连接字符串?
  11. oracle行列互换sql,Oracle实现行列转换的方法分析
  12. qt开发linux性能测试工具,基于Qt的ARM-Linux系统测试工具
  13. 计算机固态硬盘安装,台式计算机的固态硬盘安装方法和步骤教程
  14. 青花瓷 下载App Store上历史版本的App的ipa的包
  15. Unity 3D 2022.1 AND UnityHub 3.2 Patch
  16. NOIP2016普及组复赛 解题分析
  17. poj 1838 Banana
  18. 二值图像分析—轮廓发现
  19. 快速查毒及电脑防毒的解决方案
  20. 【接活平台】史上最全程序员接私活常用平台汇总

热门文章

  1. React-useCallback
  2. OSChina 娱乐弹弹弹——程序猿专属幽默
  3. 《蜗居》第一集精彩对白
  4. linux强制卸载移动硬盘,用umount命令卸载移动硬盘有几种方式
  5. Excel 从多个文件提取指定的多行(固定行)进行汇总的工具
  6. Hadoop1000条笔记总汇
  7. 码龄0.5年的python成长之路(11):找素数的模块 观察素数
  8. 最全面的计算机网络设备图块素材,做方案必备
  9. reshape函数第一个参数-1是什么意思
  10. js调用百度地图API,实现地图标注位置