Java中的"哈希表是开放的"是什么意思?

der*_*dji 6 java hashtable hash-collision

我正在阅读关于Hashtable类的Java api文档,并遇到了几个问题.在文档中,它说" 请注意哈希表是打开的:在"哈希冲突"的情况下,单个存储桶存储多个条目,必须按顺序搜索. "我自己尝试了以下代码

Hashtable<String, Integer> me = new Hashtable<String, Integer>();
me.put("one", new Integer(1));
me.put("two", new Integer(2));
me.put("two", new Integer(3));
System.out.println(me.get("one"));  
System.out.println(me.get("two"));
Run Code Online (Sandbox Code Playgroud)

输出是

1
3
Run Code Online (Sandbox Code Playgroud)
  1. 这是"开放"的含义吗?
  2. 整数2发生了什么?收集为垃圾?
  3. 有一个"封闭"的例子吗?

Avi*_*Avi 11

不,这不是"开放"的意思.

注意冲突和哈希冲突之间的区别.

Hashtable不允许多个条目具有相同的(在您的示例中,您将两个条目与键"two",第二个(3)替换为第一个(2),并且您只剩下Hashtable中的第二个).

散列碰撞是当两个不同的密钥具有相同的散列码(由它们的hashCode()方法返回).不同的哈希表实现可以以不同的方式对待它,主要是在低级实现方面.作为"开放",Hashtable将存储其键复制到相同值的条目的链接列表.在最坏的情况下,这可能导致简单操作的O(N)性能,在哈希映射中通常为O(1),其中散列大多数是不同的值.