[英]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.