散列的价值在于速度: 散列使得查询快速,由于瓶颈位于键的查找速度,
因此解决方案之一就是保持键的排序状态,然后使用Collections.binarySearch()
进行查询.
散列更进一步,它将键保存在某处,以便能够很快找到。存储一组元素最快
的数据结构是数组,所以使用它来表示键的信息(这里说的是键的信息,而不是键本身)。
但是因为数组不能够调整容量,因此就有一个问题:我们希望在Map中保存数量不确定
的值,但是如果键的数量被数组的容量限制了,该怎么办?
答案是:数组并不保存键本身,而是通过键对象生成一个数字,将其作为数组
下标。这个数字就是散列码。由定义在Object中的,切可能由你的类覆盖的hashCode()
方法。
为解决数组容量被固定的问题,不同的键可以产生相同的下标。也就是说,可能会有
冲突。因此数组多大就不重要了,任何键总能在数组中找到它的位置。
于是查询一个值的过程首先就是计算散列码,然后使用散列码查询数组。如果
能够保证没有冲突,那可就有一个完美的散列函数,但是这种情况只是特例。
通常冲突由外部链接处理:数组并不直接保存值,而是保存值的list。在后对list中的
值使用equals()方法进行线性的查询。这部分的查询自然会比较慢,但是,如果散列
函数好的话,数组的每个位置就只有较少的值。因此,不是查询整个list,而是快速
地跳到数组的某个位置,只对很少的元素进行比较。
- 大小: 60.2 KB
分享到:
相关推荐
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示...通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
### 复写`hashCode()`方法与`equals()`方法 在Java编程中,`hashCode()`方法与`equals()`方法是对象比较中的两个非常重要的方法。它们主要用于判断对象是否相等以及对象的散列值,这对于集合类(如`HashSet`)来说...
最后,hashcode 方法是一个对象的散列码,它是用来唯一标识一个对象的。hashcode 方法可以将一个对象转换为一个整数值,以便于对象的存储和比较。通常情况下,hashcode 方法需要和 equals 方法一起使用,以确保两个...
哈希表,又称散列表,是...总的来说,哈希表通过高效的散列函数和冲突解决策略实现了快速的数据存取,而hashCode()方法则是这一过程中的关键一环,它与equals()方法协同工作,确保了对象在散列集合中的正确定位和比较。
在给定的例子中,Groundhog类没有重写hashCode()方法,因此它使用了Object的hashCode()方法生成散列码,这导致了散列码的不正确性。正确的做法是重写hashCode()方法,以确保散列码的唯一性。 同时,equals()方法也...
1、何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。 ... 简单的说,“相等的对象必须具有相等的散列码”。 3、什么是equals()与如何设计equals()
散列存储的运作机制如下:当向如HashMap这样的散列容器中插入一个对象时,首先调用对象的`hashCode()`方法生成散列码。这个散列码被用来确定在内部数组中的索引位置。然而,由于不同的对象可能会生成相同的散列码,...
在实践中,可以使用Arrays.hashCode方法来计算数组的散列码,也可以使用 Guava 库中的Objects.hashCode方法来计算对象的散列码。 此外,为了提高散列表的性能,可以将对象的散列码缓存起来,如果散列码不匹配,就...
这个哈希码用于散列数据结构,如HashMap和HashSet。当我们将对象放入这些容器时,它们会使用`hashCode()`来确定对象应该存储的位置。理想的哈希码应确保不同的对象产生不同的值,以最大限度地减少哈希冲突,从而提高...
若该处已经有元素存在,就调用 equals 方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置。 这样处理,当我们存入大量元素时就可以大大减少调用 equals() 方法的次数,极大地提高了效率。hashCode ...
- 在默认情况下,`Object` 类的 `hashCode()` 方法返回的是对象的内存地址的散列值。然而,当我们自定义类时,为了确保正确的行为,我们应该根据对象的逻辑内容重写 `hashCode()`。 - 如文中所示,例如在 `String`...
hashCode方法是Java中Object类的一个方法,用于计算出对象的一个散列值,用于判断在集合中对象是否重复的关键。hashCode方法是一个本地方法,无法在Java代码中实现。 一条重要的定理是:equals相同的对象,hashCode...
两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。所以,可以考虑在集合中,判断两个对象是否相等的规则是:第一步,如果hashCode()相等,则查看第二步,否则不相等;第二...
equals() 方法用于比较两个对象的值是否相等,而 hashCode() 方法用于生成对象的哈希码,以便在散列集合中快速存取数据。 重写 equals() 方法 在 Java 中,默认的 equals() 方法是比较对象的引用是否指向同一块...
在Java编程语言中,`hashCode()`方法是一个非常重要的组成部分,特别是在使用散列数据结构如`HashTable`, `HashMap`, `HashSet`等时。`hashCode()`的主要作用是为对象生成一个唯一的整数值,这个值用于确定对象在...
在前面三篇博文中LZ讲解了(HashMap、HashSet、HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是重要也是精华的部分,所以下面LZ揭开hashCode的“神秘”面纱。...
如果不这样做的话,就会违反 Object.hashCode 的通用约定,从而导致该类无法与所有基于散列值(hash)的集合类结合在一起正常运行。 hashCode() 方法的返回值和 equals() 方法的关系如下: * 如果 x.equals(y) ...
`hashCode()` 方法是Object类的一个成员,它返回一个整数值,这个值代表了对象的哈希码,也称为散列码或指纹。这个哈希码通常用于快速查找和区分对象,因为不同的对象通常会有不同的哈希码。 哈希码的主要用途在于...
Java中的`hashCode`方法是Java编程语言中的一个重要概念,它主要与对象的散列处理相关。在Java的`Object`类中定义了一个本地方法(native)`hashCode()`,该方法返回一个`int`类型的数值。这个数值是根据对象的状态...