簡體   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