正如我们所说,对于具有相同哈希码的2个不等对象,对象存储在同一个桶中,它实际上意味着什么?
答案 0 :(得分:1)
当多个对象落入同一个存储桶时,它们将作为单个链接列表存储在该存储桶中。
散列表的优点是您可以在O(1)时间内计算密钥到达的桶。这意味着如果每个存储桶只有一个元素,则无论表中有多少元素,查找时间都保持不变。当您在一个存储桶中有多个密钥时,如果不检查每个密钥,就无法分辨出您要查找的密钥。当你有一个错误的哈希函数将许多元素放入同一个存储桶时,你会失去哈希表的优势,它开始表现得更像链表。
答案 1 :(得分:1)
具有相同哈希码的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);
}
}
假设您为p1
课程创建了两个p2
和Product
对象,并添加到HashSet
,如上所示。
根据Product
类的合同,p1
和p2
对象不相等,因为它们的产品ID不同。
在HashSet
内,这些p1
和p2
对象根据hashcode
对象返回的Product
存储在不同的存储桶中(只是放置不同的内存位置) 。
因为您的p1
和p2
对象都返回相同的哈希码(来自hashcode()
类的Product
方法),它们都将被保存到同一个桶中(内存位置) )。
同样,所有product
个对象(即使product
个对象不相等)也会被推送到同一个桶中,因为它们的哈希码是相同的。
然后,当您尝试使用product
从HashSet
搜索set.contains()
对象时,必须通过&amp;从整个产品中发现(想象你已经存储了10000个物体)。
但当您正确实施hashcode()
时,即为不等Product
个对象返回不同的哈希码,那么product
个对象将分布在不同的存储桶中检索变得更快(无需扫描所有对象),即它可以显着提高性能。
相同的概念适用于Java中所有Hash
*相关的集合API(HashMap,HashSet等)方法。
存储桶是单个内存位置还是类似于内存数组 地点?
One Bucket存储多个对象引用,每个Hash存储桶在内部使用LinkedList
或TreeMap
等数据结构来定位存储的对象。
您可以在此处查看有关同一主题的更多详细信息。