[英]Need Internal Implementation of HashTable in java
我需要用Java代码实现HashTable的内部实现 。 您还能通过代码中的其他注释向我解释它的工作原理。
我只是对HashTable中使用的负载因子和容量有一些基本知识,负载因子为0.75 。 你能用一个简短的例子来解释。
我对此坚持了很长时间。
1>为什么散列表的负载因子为0.75,而不是变化的其他值。 相当奇怪,请澄清。
2>为什么我们没有HashMap的负载因子?
我不需要现有的代码。 有些人编写的代码比实际编写的代码更好
为什么我们没有HashMap的负载因子?
我们要做-看到HashMap(int initialCapacity, float loadFactor)
为什么散列表的负载因子是0.75,而不是变化的其他值。
Hashtable
的负载因子是可调参数。
HashMaps的Javadoc对此表示0.75
值。
“通常,默认的加载因子(.75)在时间和空间成本之间提供了很好的折衷。较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和放)。”
我知道这个数字是通过经验测试而不是理论分析确定的。 (进行彻底的理论分析将很困难。但是,在大多数情况下,将0.75的负载因子与良好的哈希函数结合起来可能足以将哈希链保持在1或2个以下,这会导致平均查找时间变快。 )
源代码是免费的,您可以下载。 或在这里查看:
http://www.docjar.com/html/api/java/util/Hashtable.java.html
您的JVM具有JDK安装过程中可用的库的源代码。 您只需要选择它。 Java有两种不同的实现:HashMap和HashTable。 HashTable具有用于同步的其他内容,因此,如果需要核心实现,请查看HashMap的源代码。 除了您自己之外。
好吧,别在意双关语,但这是特定于实现的。 只要符合接口并且具有相同的预期大O运行时,它就可以执行自己喜欢的操作。
就是说,这里是Java HashTable的GCC版本的链接http://www.google.com/codesearch/p?hl=zh-CN#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
我不认为我会概述任何意见:)
您永远都不需要内部实现,因此,约书亚·布洛赫(Joshua Bloch)确实将其隐藏在我们的视野之外。 我更喜欢使用从标准Java Collections API类到Hashtable
的HashMap
。 首先,它更快(不同步)。 其次, Hashtable
在真正的集合被添加到Java中之前就已经在Java中,然后进行了修改(据我所知)。
这是java.util.HashMap<K, V>
类的JavaDoc的摘录:
and . HashMap
的实例具有两个影响其性能的参数: 和 。 is the number of buckets in the hash table, and the initial capacity is simply the capacity at the time the hash table is created. 是哈希表中存储桶的数量,初始容量只是创建哈希表时的容量。 is a measure of how full the hash table is allowed to get before its capacity is automatically increased. 是在自动增加其哈希表容量之前允许哈希表获得的满度的度量。 当哈希表中的条目数超过负载因子和当前容量的乘积时,通过调用rehash
方法,容量大约增加了一倍。
我认为这很清楚。 负载因子为0.75,初始容量为100的映射将插入前75个新映射条目,而不会分配任何内存。 如果再添加一个元素。 分配了容量为200的新存储块,并将现有项目复制到该新存储器中。 现在分配了另一个更大的内存块要达到的新项目数是150。
在HashMap
的类源代码中可以看到更多详细信息。
大多数JDK的代码都随JDK一起提供。 它在src.jar文件中。 如果使用IDE,它将自动链接到此jar,因此当您在内部类上+时,它将向您显示源。
值得注意的是,Hashtable在1998年被Java 1.2集合所取代。我不建议您使用它,除非您必须使用旧版库。
1>为什么散列表的负载因子为0.75,而不是其他变化的值,这很奇怪。
一点也不奇怪,默认值必须是某值,并且选择此值是为了获得最佳的全面性能。
我不想要现有的code.some人谁写了比实际写的更好的代码
更好意味着什么? 您是否看过Java 5.0(2005)中并发库添加的集合,某些情况下更好的是Trove4j集合,因为它们支持原语。 您还可以查看具有许多扩展功能的Guava。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.