Java基础-hashCode方法的作用?

关于hash code的作用,先来说一下自己的理解。

一般来说我们提到hash code,就是在比较两个对象是否相等的时候。从这一点入手,我们以hashmap来举例:hashmap中的数据是以entry键值对的形式存在的,hashmap是基于散列的集合,他的存储是通过hashcode来存储的。为什么要以这样的形式呢,这里就要考虑到hashmap的插入问题了。假设要往一个数据量很大的map中插入一条数据,应该怎么插入呢?可能有的人会说用equals进行比较。这确实是一种办法,但是大家要考虑的问题是这个map的数据量很大,单纯的用equals和map中的每条数据进行比较,这必然导致了查询效率的低下。这时候hashcode的作用就体现出来了,map中的数据存储是具有相同hashcode的数据散列在一起。举一个相对比较生动的例子:

map中的hashcode就像是一个个不同编号的篮子,当有数据要插入map中时,首先获取数据的hashcode值,然后在map中找对应的hashcode(篮子),如果没有找到就在map中创建一个篮子把插入的数据放进去(即没有该数据的hashcode,就直接存进map中,不再做任何比较);如果找到了对应的篮子(即相同的hashcode),然后再和篮子中的数据挨个进行equals比较,如果相同就不放进去,不同就把该数据放进这个篮子里。

通过这样的一个例子可以清晰的看出利用hashcode对map进行插入操作的话,效率会明显的提高。

对hashcode进行一下简单的总结:

如果两个对象的equals比较结果为true,那么这两个对象的hashcode值必定相等;

如果两个对象的equals比较结果为false,那么这两个对象的hashcode值有可能相等也可能不相等;(不同的数据,可以放在一个篮子里)

如果两个对象的hashcode值相等,那两个对象的equals比较结果则有可能为true,也可能为false;(通俗点讲就是我一个篮子里不能只放一个数据吧,那这样就太浪费了)

如果两个对象的hashcode值不相等,那两个对象的equals比较结果一定为false;

通过上面的这些我的理解是hashcode的作用就是为了查找使用的,这样做能够提高查找效率。下面贴一段HashCode的官方文档定义:

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

hashCode 的常规协定是:

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

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

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

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

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

本文参考与http://blog.csdn.net/fenglibing/article/details/8905007;https://www.cnblogs.com/dolphin0520/p/3681042.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容