java - 存储桶是单个内存位置还是类似于内存位置数组?

标签 java hashtable equals hashcode

当我们说,对于具有相同哈希码的两个不相等的对象,这些对象存储在同一个存储桶中时,这实际上意味着什么?

最佳答案

2 unequal objects having same hash code, the objects are stored in same bucket, what does it imply practically ?

我将通过下面的 Product 类示例向您解释这个概念:

产品类别:

public class Product {

     private int id;

     public Product(int id) {
        this.id = id;
     }

     //add getters and settes for id

     public boolean equals(Object obj) {
         Product product = (Product)obj;
         if(id == product.getId()) {
             return true;
         }
         return false;
     }

     public int hashcode() {
         return 1;
     }
}

测试类:

public class Test {

    public static void main(String[] args) {
        Set<Product> set = new HashSet<>();
        Product p1 = new Product(1);
        Product p2 = new Product(2);
        set.add(p1);
        set.add(p2);
    }
}

假设您已为 Product 类创建了两个对象 p1p2 并将其添加到 HashSet 中,如图所示如上所述。

根据 Product 类的约定,p1p2 对象不相等,因为它们的产品 ID 不同。 在 HashSet 内,这些 p1p2 对象根据 hashcode< 存储到不同的存储桶(简单地放置不同的内存位置)中Product 对象返回。 因为您的 p1p2 对象都返回相同的哈希码(来自 Product 类的 hashcode() 方法),它们都将被保存到同一个存储桶(内存位置)中。 同样,您的所有 product 对象(即使 product 对象不相等)都将被推送到同一个存储桶,因为它们的哈希码相同。

因此,当您尝试使用 set.contains()HashSet 中搜索 product 对象时,该对象必须是扫描并从整个产品中找到(假设您存储了 10000 个对象)。

但是当您正确实现 hashcode() 时,即为不相等的 Product 对象返回不同的哈希码,则 product 对象将分布在不同的存储桶中并且检索变得更快(无需扫描所有对象),即,它显着提高了性能。

同样的概念适用于 Java 中所有与 Hash* 相关的集合 API(HashMap、HashSet 等) 方法。

Is bucket a single memory location or similar to an array of memory locations ?

一个Bucket存储多个对象引用,每个Hash Bucket内部使用LinkedListTreeMap等数据结构来定位存储的对象。

您可以在此处查看有关同一主题的更多详细信息。

关于java - 存储桶是单个内存位置还是类似于内存位置数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950199/

相关文章:

Java:为什么我的对象数组的创建及其引用传递得如此缓慢?

java - 通过更改变量来设置 ArrayList 中的值会修改 ArrayList 的值

java - 应用于 Vector 的 equals() 不一致

Java:如何解决缺少 Equatable 接口(interface)的问题?

java - 停止在 Eclipse 重新启动时打开 Viewparts 窗口

java - 如何在StackView中实现onClickListener

java - 使用 equals 方法检查两个整数子集是否相等

java - Java中带有整数键的哈希表

algorithm - 为所有字谜生成相同的唯一哈希码

c# - 为什么将两个字符串作为对象进行比较会导致意外结果