2 个不相等的对象具有相同的哈希码,对象存储在
同一个桶,具体是什么意思?
我将通过以下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 对象根据Product 对象返回的hashcode 存储到不同的桶中(简单地放置不同的内存位置)。
因为您的p1 和p2 对象都返回相同的哈希码(来自Product 类的hashcode() 方法),所以它们都将保存到同一个存储桶(内存位置)中。
同样,您的所有product 对象(即使product 对象不相等)将被推送到同一个存储桶,因为它们的哈希码相同。
因此,当您尝试使用 set.contains() 从 HashSet 中搜索 product 对象时,必须从整个产品中扫描并找到该对象(假设您已存储 10000 个对象)。
但是当你正确实现你的hashcode(),即为不相等的Product对象返回不同的哈希码,那么product对象将分布在不同的桶中并且检索变得更快(无需扫描所有对象)即显着提高性能。
同样的概念适用于Java中所有Hash*相关的集合API(HashMap、HashSet等)方法。
bucket 是单个内存位置还是类似于内存数组
地点?
一个Bucket存储多个对象引用,每个Hash Bucket内部使用LinkedList或TreeMap等数据结构来定位存储的对象。
您可以在此处查看有关同一主题的更多详细信息。