现在,我正在尝试了解如何构建 Hashtable
。
最有趣的 - 当对象被添加到 Hashtable
时?
我在一本书中读到:
第一步:
计算hashCode()
对象。
接下来,我们确定这个对象在Hashtable
中的位置:obj.hashCode() % Hashtable.length
。
例如,向Hashtable
中添加更多元素:
Hashtable<String, String> hm=new Hashtable<String, String>(100);
hm.put("Lee","Lee");
hm.put("lee","lee");
hm.put("eel","eel");
定义一个用于放置对象的桶:
System.out.println("Lee".hashCode() % 100);
System.out.println("lee".hashCode() % 100);
System.out.println("eel".hashCode() % 100);
如果我理解算法,对象必须按如下方式放置在表中:
eel /*because,"eel".hashCode() % 100=0*/,
lee /*because, "lee".hashCode() % 100=20*/,
Lee /*because, "Lee".hashCode() % 100=68*/
但我们看到的结果是什么?
System.out.println(hm);
{Lee=Lee, lee=lee, eel=eel}
请告诉我,我哪里做错了?
最佳答案
Hashtable
(以及 HashMap
)元素的迭代顺序无法保证(依赖于实现),因此恕我直言,尝试建立一个理论没有多大意义它。它甚至可能在不同的 Java 版本之间发生变化(它确实从 Java5 到 Java6 发生了变化)。
顺便说一句,Hashtable
已经过时了,建议改用(和分析)HashMap
。
作为基本的 HashMap 实现,您的描述对我来说听起来不错。然而,HashMap
的实际实现要比这复杂得多,至少从 Java4 开始是这样。例如。哈希表的大小始终是 2 的幂(对于像您描述的那样的基本哈希表,这将是一个非常糟糕的决定),并且从关键对象获得的哈希值在内部重新哈希以实现在实际大小上更均匀的分布表的。有关这方面的更多详细信息,请参阅以下 Java 专家通讯:
关于java - 哈希表。怎么运行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975673/