繁体   English   中英

需要Java中HashTable的内部实现

[英]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,而不是变化的其他值。

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

  2. HashMaps的Javadoc对此表示0.75值。

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

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

可以下载源代码。 您甚至可能已经拥有它-如果您正在使用Eclipse,请按Ctrl-Shift-T,输入“哈希表”,然后查看是否可以看到源代码。 绝对最好自己下载代码,而不要直接在此处发布。

如果您对实现有任何特定问题,请提问(通过编辑此问题或询问其他问题)。 关于“哈希表如何工作”的一般性问题不太可能使您望而却步……尽管阅读有关一般性原则的内容不会有任何伤害。

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

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)确实将其隐藏在我们的视野之外。 我更喜欢使用从标准Ja​​va Collections API类到HashtableHashMap 首先,它更快(不同步)。 其次, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM