基础不牢固,一直不太明白hashCode是干啥的,惭愧惭愧。
刚在CSDN论坛上看到了一段解释,令我豁然开朗。
在存放集合这种数据的时候,我们可以选择List和Set两种形式,当然,Java当中它们不是具体的实现类.我们可以使用具体的实现类进行数据的存储.
但是List和Set的最显著区别,应该是,List可以放置相同的元素,Set只能放置不同的元素.也就是说Set里面的元素具有唯一性.
当然ArrayList和LinkedList也只是具体的实现形式不同了.我们也可以实现一个ArraySet或LinkedSet.但是.我们会发现一个比较严重的问题.就是.当我们向ArraySet(或LinkedSet)里面添加元素的时候,我们要逐个比较里面的所有已有元素.这样,当集合中数量非常多的时候,比较次数也会直线上升.也就是说,当我们结合中有10000个元素的时候,我再添加一个元素,要首先比较最多10000次才能确定我要添加的元素是否已经存在了,这会严重影响集合的性能.
为了更快捷的检索数据,我们才引进了hashCode的概念,每个Set里面的元素都会有一个hashCode的值,我们可以按照hashCode的值来存储集合里面的元素.如果要检索集合里面是否存在要添加的元素,只要先将该元素的hashCode值算出来,再到相应的位置进行查找,就可以了.对于相同hashCode的不同元素,我们把这个位置,按照链表的形式进行存放.这样,就可以很大程度上减少比较的次数.举个例子:
我们Set集合里面可能已经10000个不同的元素了.当添加新元素的时候,我们根据新元素的hashCode值,找到相应的位置,这个位置所对应的链表里面,可能只有五个元素,那么,我们只要比较5次,就可以判断整个集合中是否已经存在该元素了,因为,相同元素的hashCode一定是相同的.呵呵.为了使根据hashCode确定位置的速度更快,我们采用数组的下标来表示位置,数组里面存放链表.下标都是自然数,所以,要把hashCode进行向数组下标的映射转换(其实就是与运算).
最后,来谈谈,什么情况下重写hashCode,我们知道,自然情况下,hashCode所产生的值是很有规律的,这样的话,拥有10000个元素的Set,可能有9000个都在同一个位置上,这样,再加一个相同hashCode的元素时,那可能要比较90000次了.所以,我们要自己定义hashCode使得这些元素的hashCode在hashSet里面存储更加分散.不过Java的HashSet里面,已经有一个方法,将元素的hashCode做打散处理了,这个方法对于默认的hashCode还是比较有效果的.对于熟悉这些内容的程序员,为了程序的效率更高,可以重写hashCode方法.但是,不能使用随机数充当hashCode,每个元素,都应该对应唯一的一个hashCode,一个hashCode可以对应多个元素.
也可以这么说,只要对象内容一样,我们就有必要重写它的hashCode,hashCode代表的是对象的内存地址,或者说内存地址根据这个hash码得到, 一般的集合都重写了hashCode方法,而当我们自定义对象的时候就要重写hasdCode方法,保证内容一样的对象算出相同的hash码。hash码的用处只体现在需要散列的地方,如hashSet、hashMap,提高用户查找速度。
分享到:
相关推荐
本篇将深入探讨ArrayList与HashSet的区别,并分析Hashcode在其中的作用。 ArrayList是基于动态数组实现的,它提供了按索引访问元素的能力,就像在数组中一样。由于内部维护了一个数组,ArrayList保证了元素的顺序性...
在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演着关键角色。它可以快速地判断两个对象是否相等,从而提高散列表的性能。 证明Hashcode不是内存地址 有人认为Hashcode是对象在内存中的地址,但这是一种...
为了更好地理解`hashCode`的作用及其在实际开发中的重要性,我们可以从以下几个方面进行深入探讨: #### 1. 基本概念 `hashCode`方法是`java.lang.Object`类中的一个方法,所有Java类都继承自`Object`类,因此每个...
* 在 HashSet 中,hashCode 用于确定对象的存储地址。 * 在 HashMap 中,hashCode 用于确定键的存储地址。 * 在排序算法中,hashCode 用于快速定位到目标对象。 equals() 和 hashCode() 的关系 equals() 和 ...
在 Java 中,HashSet、HashMap 等集合类的实现中,都是通过 HashCode 来实现对象的唯一性和快速查找的。那么,hashCode 是如何工作的呢?当我们向一个集合中添加某个元素时,集合会首先调用 hashCode 方法,这样就...
Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代...
- **`equals`方法的作用**:当两个对象的`hashCode`相同时,`HashSet`会调用这两个对象的`equals`方法来最终确定是否为同一个对象。 - **效率问题**:对于大量数据而言,`HashSet`的效率非常高。哈希表通过`hashCode...
在Java集合框架中,特别是`HashSet`、`HashMap`等基于哈希表的数据结构中,`hashCode()`扮演着至关重要的角色。 **1.1 `hashCode()`的作用** - **定位对象**: 当一个对象被插入到哈希表中时,`hashCode()`可以帮助...
- 当`HashSet`中的元素为自定义类型时,必须正确地重写`equals()`和`hashCode()`方法以确保元素的唯一性和性能。 以上是对`HashSet`类的基本用法及特性的一个详细介绍。希望这些内容能帮助读者更好地理解和使用`...
在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...
在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...
在HashSet中,当调用add()方法时,它会检查新元素的hashCode()值,如果该值对应的HashMap位置上已经存在元素,则再调用equals()方法来判断是否真正重复。如果equals()方法返回true,则说明当前元素与已存在元素相等...
例如,在 HashSet 中,我们可以使用 hashcode 方法来比较两个对象是否相同。如果两个对象的散列码相同,我们可以认为它们是相同的对象。 == 号、equals 方法和 hashcode 方法都是用来比较对象的,但是它们之间存在...
在集合类(如`HashSet`)中,元素的存储依赖于`hashCode()`和`equals()`方法。如果两个元素的`hashCode()`相同,则需要通过`equals()`方法进一步确认是否为相同的元素。这在处理大量数据时可以显著提高效率。 #### ...
`hashCode()` 的作用是为对象生成一个唯一的整数值,这个值通常被用来快速定位对象在哈希表(如 `HashSet` 或 `HashMap`)中的位置。`hashCode()` 的设计必须满足以下条件: 1. 相等的对象必须具有相同的哈希码:...
在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。当自定义类时,有时需要根据业务逻辑重写这两个方法以满足...
在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。这些集合类各自有着独特的特性和应用场景,下面将对它们进行详细介绍。...
在Java编程语言中,`hashCode()`方法是一个非常重要的组成部分,特别是在使用散列数据结构如`HashTable`, `HashMap`, `HashSet`等时。`hashCode()`的主要作用是为对象生成一个唯一的整数值,这个值用于确定对象在...
1. 不允许有重复元素:HashSet在添加元素时会通过重写`equals()`和`hashCode()`方法来判断元素是否相同,因此,添加的元素必须具有良好的equals和hashCode一致性。 2. 非有序:HashSet中的元素没有固定的顺序,每次...