2010-12-06 41 views
0

我需要内部实现HashTable在java代码中。进一步,你可以解释我与其他意见代码作为它如何工作。在java中需要内部实现HashTable

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

我很久没有这个了。

1>为什么散列表的加载因子为0.75,而不是其他值不等。很奇怪请澄清。

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

+1

来源可以在这里找到... http://developer.classpath.org/doc/java/util/Hashtable-source.html – 2010-12-06 14:46:29

+0

你看过Java源代码吗? – Sean 2010-12-06 14:46:40

+0

伙计们感谢您的即时答复,但是问题1和问题2 – Deepak 2010-12-06 14:49:03

回答

4

为何我们对客座率HashMap?

我们 - 看HashMap(int initialCapacity, float loadFactor)

为什么是散列表负载系数0.75,而不是其变化的一些其他的价值。

  1. 负荷系数为Hashtable一个可调参数。

  2. HashMaps的javadoc说的是关于0.75的值。

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

我知道这个数字是由经验测试而不是理论分析确定的。 (一个彻底的理论分析将是困难的,但是,在绝大多数情况下,加载因子为0.75并结合一个好的散列函数可能足以将散列链降低到1或2,并且导致快速的平均查找时间。 )

1

源代码是available for download。你甚至可以拥有它 - 如果你使用Eclipse,点击Ctrl-Shift-T,键入“Hashtable”,看看你是否可以看到源代码。自己下载代码绝对比它刚刚发布在这里更受欢迎。

如果您有任何特定关于实施的问题,请问(通过编辑此问题或询问另一个问题)。 “Hashtable工作如何”的一般问题不太可能让你感到非常满意......尽管在general principles上阅读并不会造成任何伤害。

1

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

1

你应该永远不需要内部的实现,这就是为什么约书亚布洛赫确实把它从我们身边隐藏起来。我更喜欢使用标准Java Collections API类中的HashMapHashtable。首先,它更快(不同步)。其次,Hashtable在真正的收藏品被添加到那里之前就已经在Java了,然后它被改编(据我所知)。

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

HashMap实例有影响其性能的两个参数:初始容量负载因子容量是哈希表中桶的数量,初始容量仅仅是哈希表创建时的容量。 加载因子是散列表在其容量自动增加之前被允许获得的满量程的度量。当哈希表中的条目数超过负载因子与当前容量的乘积时,通过调用rehash方法,容量大约增加一倍。

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

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

0

大部分JDK的代码都附带了JDK。它位于src.jar文件中。如果你使用IDE,它会自动链接到这个jar,所以当你在一个内部类上时,它会向你显示源代码。

值得注意的是,Hashtable在1998年被Java 1.2集合所取代。我不推荐你使用它,除非你必须为遗留的库。

1>为什么是负载系数为0。75为散列表,而不是其他一些值不同的值。很奇怪。

根本不奇怪,默认值必须是某种东西,并且此值被选为最佳的全面性能。

我不想现有code.some一个谁写比实际写入

一个更好的代码你说的更好呢?你看过在Java 5.0(2005)中使用并发库添加的集合吗?在某些情况下更好一些,是作为这些支持基元的Trove4j集合。你也可以看看有很多扩展的番石榴。