【问题标题】:Need Internal Implementation of HashTable in javajava中需要HashTable的内部实现
【发布时间】:2010-12-06 14:43:03
【问题描述】:

我需要java代码中HashTable的内部实现。您能否进一步用代码中的 Additional cmets 向我解释它是如何工作的。

我只是对 HashTable 中使用的负载因子和容量有一些基本知识,其中负载因子为 0.75。你能用一个简单的例子解释一下吗?

我已经坚持了很长时间。

1> 为什么 hashtable 的负载因子为 0.75 而不是其他变化的值。很奇怪请澄清。

2> 为什么我们没有 HashMap 的负载因子?
我不想要现有的代码。有些人写的代码比实际写的更好

【问题讨论】:

标签: java collections hashtable


【解决方案1】:

为什么我们没有 HashMap 的负载因子?

我们有 - 见HashMap(int initialCapacity, float loadFactor)

为什么哈希表的负载因子是 0.75 而不是其他变化的值。

  1. Hashtable 的负载系数一个可调参数。

  2. HashMaps 的 javadoc 说明了 0.75 值。

“作为一般规则,默认加载因子 (.75) 在时间和空间成本之间提供了良好的折衷。较高的值会减少空间开销,但会增加查找成本(反映在HashMap 类,包括 get 和 put)。"

我了解该数字是通过经验测试而非理论分析确定的。 (进行彻底的理论分析会很困难。但是,在绝大多数情况下,0.75 的负载因子与良好的散列函数相结合可能足以将散列链保持在 1 或 2,从而缩短平均查找时间。 )

【讨论】:

    【解决方案2】:

    源代码是available for download。您甚至可能已经拥有它——如果您使用的是 Eclipse,请按 Ctrl-Shift-T,键入“Hashtable”并查看是否可以看到源代码。自己下载代码绝对比在这里发布更可取。

    如果您对实施有任何具体问题,请提出这些问题(通过编辑此问题或询问其他问题)。 “哈希表是如何工作的”这个一般性问题不太可能让你走得太远......尽管阅读general principles 不会受到伤害。

    【讨论】:

    • 我不是 NetBeans 粉丝,但如果你有 NetBeans,你可以输入 Ctrl+O 并输入 Hashtable 并查看源代码。
    【解决方案3】:

    源代码是免费的,您可以下载它。或者在这里查看:

    http://www.docjar.com/html/api/java/util/Hashtable.java.html

    【讨论】:

      【解决方案4】:

      您的 JVM 具有可作为 JDK 安装一部分的库的源代码。你只需要选择它。 Java 有两种不同的实现方式:HashMap 和 HashTable。 HashTable 有额外的东西用于同步,所以如果你想要核心实现,请查看 HashMap 的源代码。除此之外,您只能靠自己了。

      【讨论】:

        【解决方案5】:

        好吧,不要介意双关语,但它是特定于实现的。只要它符合接口并具有与预期相同的大 O 运行时,它就可以做任何喜欢的事情。

        这里说的是 GCC 版本的 Java HashTable http://www.google.com/codesearch/p?hl=en#t4cUIrRdV2U/gnu/mingw/gcc-java-3.4.2-20040916-1-src.tar.gz|HvPdZYyCY6Q/gcc-3.4.2-20040916-1/libjava/java/util/Hashtable.java&q=HashTable.java的链接

        我不认为我会概述任何 cmets :)

        【讨论】:

          【解决方案6】:

          您永远不需要内部实现,这就是 Joshua Bloch 将其隐藏起来的原因。我更喜欢使用标准 Java Collections API 类中的 HashMapHashtable。首先,它更快(不同步)。其次,Hashtable 在真正的集合被添加到那里之前就已经在 J​​ava 中了,然后它被改编了(据我所知)。

          这是java.util.HashMap<K, V>类的JavaDoc的摘录:

          HashMap 的实例有两个影响其性能的参数:initial capacityload factor容量是哈希表中桶的数量,初始容量就是哈希表创建时的容量。 负载因子 衡量哈希表在其容量自动增加之前允许达到的程度。当哈希表中的条目数超过负载因子与当前容量的乘积时,通过调用rehash方法,容量大致翻倍。

          我认为这很清楚。加载因子为 0.75 且初始容量为 100 的映射将插入前 75 个新映射条目,而无需任何内存分配。如果你再添加一个元素。分配一个容量为 200 的新内存块,并将现有项目复制到这个新内存中。为了分配另一个更大的内存块而要达到的新项目数现在是 150。

          更多细节可以在HashMap的类源代码中看到。

          【讨论】:

          • 精湛的解释。你的解释真的很好。
          【解决方案7】:

          大部分 JDK 的代码都随 JDK 一起提供。它在 src.jar 文件中。如果您使用 IDE,它会自动链接到此 jar,因此当您在内部类上 + 时,它会显示源代码。

          值得注意的是,Hashtable 在 1998 年被 Java 1.2 集合取代。我不建议您使用它,除非您必须使用旧库。

          1> 为什么哈希表的负载因子是 0.75 而不是其他变化的值。很奇怪。

          一点也不奇怪,默认值必须是某个值,并且选择此值是为了获得最佳的综合性能。

          我不想要现有的代码。有人编写了比实际编写的代码更好的代码

          你说的更好是什么意思?你看过 Java 5.0 (2005) 中的并发库添加的集合吗?在某些情况下更好的是 Trove4j 集合,因为这些支持原语。你也可以看看有很多扩展的 Guava。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-31
            • 1970-01-01
            • 1970-01-01
            • 2012-04-04
            • 2014-01-18
            • 2017-07-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多