Java基础之hashCode方法详解

想要明白hashCode的作用,必须要先知道java中的集合。(不明白的请看Java基础之集合框架详解(二)List篇Java基础之集合框架详解(三)Set篇

Java中的Collection集合有两类,一类是List,另一类是Set,前者集合内的元素是有序的,元素可以重复;后者元素无序且元素不可重复。而我们通常使用Object.equals方法来判断两个元素是否重复。即当我们想查找一个元素中是否包含某个对象时,就是逐一取出每个元素与要找的元素进行比较,当发现某个元素与要查找的对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则返回否定的信息,如果一个集合中有很多元素譬如成千上万个元素,并且没有包含要查找的对象时,则以为着我们的程序需要从该集合中取出成千上万个元素进行逐一比较才能得到结果,于是,有人发明了一种哈希算法来提高从集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。

hashCode可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上了,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其他的地址。这样一来实际调用equals方法的次数就大大的降低了,几乎只需要一两次。

由于使用哈希算法的高效率,Set接口的重要实现类hashSet实际上就是采用的哈希算法来判断重复元素。具体请移步Java基础之集合框架详解(三)Set篇

小结:

  • 只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法,及时程序可能暂时不会用到当前类的hashCode方法,但是为它提供一个hashCode方法也没有什么不好,没准以后什么时候又用到这个方法了,所以通常要求hashCode方法和equals方法同时被覆盖。
  • equals方法相等的两个对象,hashCode方法一定相等,equals方法不相等的两个对象,却不能证明他们的hashCode方法不相等。换句话说equals方法不相等的两个对象,hashCode有可能相等。反过来,hashCode方法不相等的两个对象,一定能推出equals方法也不等;hashCode方法相等的两个对象,equals方法可能相等,可能不等。
时间: 2024-10-13 09:01:55

Java基础之hashCode方法详解的相关文章

Java提高篇——equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj)

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法

Java 8的default方法详解

Java 8的default方法详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类.下面我们通过例子来说明这一点. public class MyClass implements InterfaceA { public static void main(String[] args){ } @Override public void saySomething(

java基础之HTTP协议详解

关于本文,是听了某个老师的课程之后倍感自己对HTTP了解不够深入,因此决定写此博文. 首先,可以参考此文:http://blog.csdn.net/gueter/article/details/1524447 第一部分:浏览器与服务器通信过程: 第二部分:HTTP请求介绍: 第三部分:HTTP协议响应 java基础之HTTP协议详解

java中System.getProperty()方法详解

java中System.getProperty()方法详解,如下: System.out.println("java版本号:" + System.getProperty("java.version")); // java版本号 System.out.println("Java提供商名称:" + System.getProperty("java.vendor")); // Java提供商名称 System.out.println

Java 基础:hashCode方法

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 泥瓦匠最近被项目搞的天昏地暗.发现有些要给自己一些目标,关于技术的目标: 专注很重要.专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览.有时候,就是那样你越是专注方面越多对自己打击越大学啥啥都不好.今天带来Java基础:hashCode方法 二.hashCode方法 hash code(散列码,也可以叫哈希码值)是对象产生的一个整型值.其生成没有规律的.二者

Java中的equals和hashCode方法详解

Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复. 这里我们首先要明白一个问题: equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等.换

Java基础之hashCode方法具体解释

想要明确hashCode的作用,必须要先知道java中的集合.(不明确的请看Java基础之集合框架具体解释(二)List篇和Java基础之集合框架具体解释(三)Set篇) Java中的Collection集合有两类.一类是List,还有一类是Set,前者集合内的元素是有序的,元素能够反复:后者元素无序且元素不可反复. 而我们通常使用Object.equals方法来推断两个元素是否反复.即当我们想查找一个元素中是否包括某个对象时.就是逐一取出每一个元素与要找的元素进行比較.当发现某个元素与要查找的

Kotlin——基础的函数/方法详解

对于Kotlin中的函数来说,和JavaScript或者Lua这些语言很像,它有着这些语言的特性.但是也与这些语言就着许多不同之处.或许你更了解Java语言,然而对于Java语言来说,它不是不是闭包这个特性的.由于在这篇文章主要是讲解函数的基本使用,故而只会讲解到函数的定义.函数的返回值.函数的参数等.剩下的部分我会在这个系列的高级篇会给大家奉上. 目录 一.函数的声明及基本使用 在Kotlin中函数的声明,同JavaScript相似. 1.1.函数的声明 Kotlin中的函数声明关键字为:fu