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

时间:2016-12-03 16:57:29

标签: java hashtable equals hashcode

正如我们所说,对于具有相同哈希码的2个不等对象,对象存储在同一个桶中,它实际上意味着什么?

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课程创建了两个p2Product对象,并添加到HashSet,如上所示。

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

然后,当您尝试使用productHashSet搜索set.contains()对象时,必须通过&amp;从整个产品中发现(想象你已经存储了10000个物体)。

当您正确实施hashcode()时,即为不等Product个对象返回不同的哈希码,那么product个对象将分布在不同的存储桶检索变得更快(无需扫描所有对象),即它可以显着提高性能。

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

  

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

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

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