当我们说,对于具有相同哈希码的两个不相等的对象,这些对象存储在同一个存储桶中时,这实际上意味着什么?
最佳答案
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
类创建了两个对象 p1
和 p2
并将其添加到 HashSet
中,如图所示如上所述。
根据 Product
类的约定,p1
和 p2
对象不相等,因为它们的产品 ID 不同。
在 HashSet
内,这些 p1
和 p2
对象根据 hashcode< 存储到不同的存储桶(简单地放置不同的内存位置)中
由 Product
对象返回。
因为您的 p1
和 p2
对象都返回相同的哈希码(来自 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内部使用LinkedList
或TreeMap
等数据结构来定位存储的对象。
您可以在此处查看有关同一主题的更多详细信息。
关于java - 存储桶是单个内存位置还是类似于内存位置数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950199/