java - 哈希表。怎么运行的?

标签 java hashtable

现在,我正在尝试了解如何构建 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/

相关文章:

c - 通过套接字发送哈希表的内容

关闭后Java线程仍在内存中

java - 打印一个 int 数组

java - 在 HashMap 内部存储 HashMap

java - Jooq 的 addOrderBy() 方法有什么问题?

c++ - 添加到哈希表

c - "Bad permissions for mapped region at address"哈希表的 Valgrind 错误

android - Android 中的 HashMap

java - 为什么JavaFX中TextField继承自javafx.scene.Parent?

c++ - 带链接列表的哈希表中的前 10 个频率