需要在java中内部实现HashTable

时间:2010-12-06 14:43:03

标签: java collections hashtable

我需要java代码中的 HashTable内部实现。您还可以通过代码中的其他注释来解释我的工作原理。

我对HashTable中使用的负载系数和容量有一些基本知识,其中负载系数 0.75 。你能用一个简短的例子来解释。

我很长时间都坚持这个。

1>为什么哈希表的加载因子为0.75 而不是其他一些不同的值。很奇怪请澄清。

2 - ;为什么我们没有HashMap的加载因子?
我不想要现有的代码。有人编写了比实际写的代码更好的代码

7 个答案:

答案 0 :(得分:5)

  

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

我们这样做 - 请参阅HashMap(int initialCapacity, float loadFactor)

  

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

  1. Hashtable 的加载因子是可调参数。

  2. HashMaps的javadoc说明了0.75值。

  3.   

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

    据我所知,这个数字是通过经验测试而不是理论分析来确定的。 (彻底的理论分析将很困难。但是,0.75的加载因子与良好的散列函数相结合可能足以在大多数情况下将哈希链保持为1或2,这导致快速的平均查找时间。 )

答案 1 :(得分:1)

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

如果您有关于实施的任何特定问题,请询问(通过编辑此问题或询问另一个问题)。一个关于“Hashtable如何工作”的一般性问题不太可能让你走得太远......尽管阅读general principles并不会受到伤害。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您的JVM具有可用作JDK安装一部分的库的源代码。你只需要选择它。 Java有两种不同的实现:HashMap和HashTable。 HashTable有额外的同步功能,所以如果你想要核心实现,请查看HashMap的源代码。除此之外,你是独立的。

答案 4 :(得分:1)

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

这里说的是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的GCC版本的链接

我认为我不会概述任何评论:)

答案 5 :(得分:1)

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

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

HashMap的实例有两个影响其性能的参数:初始容量加载因子 capacity 是哈希表中的桶数,初始容量只是创建哈希表时的容量。 加载因子衡量哈希表在其容量自动增加之前可以获得多长。当哈希表中的条目数超过加载因子和当前容量的乘积时,通过调用rehash方法,容量大致加倍。

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

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

答案 6 :(得分:0)

大多数JDK的代码都带有JDK。它位于src.jar文件中。如果您使用IDE,它将自动链接到此jar,因此当您在内部类上时,它将显示源。

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

  

1&GT;为什么哈希表的加载因子为0.75而不是其他一些变化的值。非常奇怪。

一点都不奇怪,默认必须是某种东西,并且选择这个值是为了获得最好的全面表现。

  

我不想要现有的code.some一个编写了比实际写的代码更好的代码

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