【问题标题】:Hashtable. How it works?哈希表。这个怎么运作?
【发布时间】:2012-07-18 20:07:15
【问题描述】:

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

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

【问题讨论】:

    标签: java hashtable


    【解决方案1】:

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

    顺便说一句,Hashtable 已过时,建议改用(和分析)HashMap

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

    【讨论】:

    • +1 "它甚至可能在不同的 Java 版本之间发生变化。"在 Perl 中,它甚至会在程序调用之间发生变化,以防止使用哈希冲突的拒绝服务攻击。
    • 一个额外的hash函数,防止不同key在同一个bucket中发生冲突。
    【解决方案2】:

    哈希表是从键到值的映射。打印 Hashtable 时会显示此映射。

    关于.hashCode.equals 的故事粗略描述了它如何设法在内部跟踪键/值对。

    对您的问题的一些评论:

    • 您在示例中设置为 100 的 capacity不代表存储对象的桶数。它表示 Hashtable 可容纳的对象数,负载系数为 0.75。

    • 存储桶的数量在运行时可能会有所不同。如果长时间不断添加对象,负载因子会增加,并且可能会重新分配桶并“重新散列”对象。

    From the docs:

    负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。初始容量和负载系数参数只是实现的提示。关于何时以及是否调用 rehash 方法的确切细节依赖于实现

    【讨论】:

      【解决方案3】:

      hashtable的概念是将对象按照某种hash函数添加到表中(取对象并返回索引)。

      您对哈希表的描述只是众多(许多...)之一,如果它以与您阅读的方式相同的 Java 实现,我会感到惊讶。

      【讨论】:

        【解决方案4】:

        如前所述,Hashtable 依赖于实现,我建议阅读有关 Hashtable 的一般信息,以了解它们的工作原理,然后在了解其工作原理后阅读 Java 或其他语言的特定实现。

        Wikipedia 有一篇关于这个主题的文章非常好,所以我建议先阅读这篇文章。

        【讨论】:

          猜你喜欢
          • 2023-03-23
          • 2013-03-24
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-04
          相关资源
          最近更新 更多