哈希表.这个怎么运作?

use*_*011 3 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");
Run Code Online (Sandbox Code Playgroud)

定义一个放置对象的桶:

    System.out.println("Lee".hashCode() % 100);
    System.out.println("lee".hashCode() % 100);
    System.out.println("eel".hashCode() % 100);
Run Code Online (Sandbox Code Playgroud)

如果我理解算法,则必须将对象放在表中,如下所示:

eel /*because,"eel".hashCode() % 100=0*/, 
lee /*because, "lee".hashCode() % 100=20*/, 
Lee /*because, "Lee".hashCode() % 100=68*/
Run Code Online (Sandbox Code Playgroud)

但是我们看到了什么?

System.out.println(hm);

{Lee=Lee, lee=lee, eel=eel} 
Run Code Online (Sandbox Code Playgroud)

请告诉我,我哪里出错了?

Pét*_*rök 7

Hashtable(以及HashMap)元素的迭代顺序不能得到保证(依赖于实现),因此恕我直言,尝试在其上构建理论并没有多大意义.它甚至可能在不同的Java版本之间发生变化(它确实从Java5变为Java6).

顺便说一句Hashtable是过时的,建议使用(和分析)HashMap.

作为基本的哈希映射实现,您的描述听起来不错.但是,实际的实现HashMap比这更复杂,至少从Java4开始.例如,哈希表的大小始终是2的幂(对于您描述的基本哈希表,这将是一个非常糟糕的决定),并且从内部重新获得从关键对象获得的哈希值,以实现比实际更均匀的分布桌子的大小.有关此内容的更多详细信息,请参阅Java专家时事通讯的以下问题: