<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Java `Hashtable`類 > 原文: [https://howtodoinjava.com/java/collections/hashtable-class/](https://howtodoinjava.com/java/collections/hashtable-class/) **Java `Hashtable`**類是哈希表數據結構的實現。 它與 Java 中的[`HashMap`](https://howtodoinjava.com/java-hashmap/)非常相似,最顯著的區別是`Hashtable`是**同步的**而`HashMap`不是。 在此**哈希表教程**中,我們將學習它的內部結構,[構造器](https://howtodoinjava.com/oops/java-constructors/),方法,用例和其他要點。 ```java Table of Contents 1\. How Hashtable Works? 2\. Hashtable Features 3\. Hashtable Constructors 4\. Hashtable Methods 5\. Hashtable Example 6\. Hashtable Performance 6\. Hashtable vs HashMap 8\. Conclusion ``` ## 1\. `Hashtable`如何工作? `Hashtable`內部包含存儲鍵/值對的存儲桶。 哈希表使用鍵的[哈希碼](https://howtodoinjava.com/java/basics/java-hashcode-equals-methods/)確定鍵/值對應映射到哪個存儲桶。 ![Java Hashtable](https://img.kancloud.cn/df/ce/dfceca0bf38f8de0407726dbaba3dd30_451x226.png) Java 哈希表 從鍵的哈希碼中獲取存儲桶位置的函數稱為[**哈希函數**](https://howtodoinjava.com/security/how-to-generate-secure-password-hash-md5-sha-pbkdf2-bcrypt-examples/)。 從理論上講,哈希函數是一種函數,當給定鍵時,該函數會在表中生成地址。 哈希函數總是返回對象的數字。 兩個相等的對象將始終具有相同的數字,而兩個不相等的對象可能并不總是具有不同的數字。 當我們將對象放入哈希表時,不同的對象(通過`equals()`方法)可能具有相同的哈希碼。 這稱為**沖突**。 為了解決沖突,哈希表使用列表的[數組](https://howtodoinjava.com/java-array/)。 映射到單個存儲桶(數組索引)的對存儲在列表中,列表引用存儲在數組索引中。 ![Hashtable collision](https://img.kancloud.cn/c0/80/c080cca347da125727f790b273326b4d_277x195.png) 哈希沖突 #### 1.1 `Hashtable`聲明 `Hashtable`類在 Java 中聲明如下。 它**擴展了字典**類,并且**實現`Map`** ,[`Cloneable`](https://howtodoinjava.com/java/cloning/a-guide-to-object-cloning-in-java/)和[`Serializable`](https://howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/)接口。 `'K'`是鍵的類型,`'V'`是鍵的映射值的類型。 ```java public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable { //implementation } ``` ## 2\. `Hashtable`特性 有關 Java `Hashtable`類的重要知識是: 1. 它類似于`HashMap`,但是它是同步的,而`HashMap`沒有[同步](https://howtodoinjava.com/java/multi-threading/what-is-thread-safety/)。 2. 它不接受`null`鍵或值。 3. 它不接受重復的鍵。 4. 它將鍵值對存儲在內部維護列表數組的哈希表數據結構中。 每個列表可以被稱為桶。 如果發生沖突,則將對存儲在此列表中。 5. `Hashtable`中的枚舉器不是快速失敗的。 ## 3\. `Hashtable`構造器 `Hashtable`類具有四個構造器。 * **`Hashtable()`**:這是默認構造器。 它使用默認的初始容量(11)和負載因子(0.75)構造一個新的空哈希表。 * **`Hashtable(int size)`**:它構造一個具有指定初始大小的新的空哈希表。 * **`Hashtable(int size, float fillRatio)`**:構造一個具有指定初始大小和填充率的新的空哈希表。 * **`Hashtable(Map m)`**:構造一個哈希表,該哈希表使用指定映射中的鍵值對初始化。 請注意,**初始容量**是指哈希表中的存儲桶數。 需要最佳數量的存儲桶來存儲具有最小沖突(以提高性能)和有效內存利用率的鍵值對。 **填充率**確定在增加哈希表的容量之前可以達到多少。 它的值介于 0.0 到 1.0 之間。 ## 4\. `Hashtable`方法 `Hashtable`類中的方法與`HashMap`非常相似。 看一看。 * **`void clear()`**:用于刪除哈希表中的所有對。 * **`boolean contains(Object value)`**:如果哈希表中存在任何對,則返回`true`,否則返回`false`。 注意,該方法的特性與`containsValue()`特性相同。 * **`boolean containsValue(Object value)`**:如果哈希表中存在任何對,則返回`true`,否則返回`false`。 * **`boolean containsKey(Object key)`**:如果哈希表中存在任何對,則返回`true`,否則返回`false`。 * **`boolean isEmpty()`**:如果哈希表為空,則返回`true`;否則,返回 0。 如果它包含至少一個鍵,則返回`false`。 * **`void rehash()`**:用于增加哈希表的大小并重新哈希其所有鍵。 * **`Object get(對象鍵)`**:它返回指定鍵所映射到的值。 如果找不到這樣的鍵,則返回`null`。 * **`Object put(Object key, Object value)`**:它將哈希表中指定的`key`映射到指定的`value`。 鍵和值都不能為`null`。 * **`Object remove(Object key)`**:它從哈希表中刪除鍵(及其對應的值)。 * **`int size()`**:它返回哈希表中的條目數。 ## 5\. `Hashtable`示例 我們來看一個有關如何在 Java 程序中使用哈希表的示例。 ```java import java.util.Hashtable; import java.util.Iterator; public class HashtableExample { public static void main(String[] args) { //1\. Create Hashtable Hashtable<Integer, String> hashtable = new Hashtable<>(); //2\. Add mappings to hashtable hashtable.put(1, "A"); hashtable.put(2, "B" ); hashtable.put(3, "C"); System.out.println(hashtable); //3\. Get a mapping by key String value = hashtable.get(1); //A System.out.println(value); //4\. Remove a mapping hashtable.remove(3); //3 is deleted //5\. Iterate over mappings Iterator<Integer> itr = hashtable.keySet().iterator(); while(itr.hasNext()) { Integer key = itr.next(); String mappedValue = hashtable.get(key); System.out.println("Key: " + key + ", Value: " + mappedValue); } } } ``` 程序輸出。 ```java {3=C, 2=B, 1=A} A Key: 2, Value: B Key: 1, Value: A ``` ## 6\. `Hashtable`性能 對于大多數常見操作(例如`get()`,`put()`,`contains()`等),與`Hashtable`中的`O(n)`相比,性能明智的`HashMap`在 `O(log(n))`中執行。 `Hashtable`中樸素的線程安全方法(“同步每個方法”)使線程應用程序變得更加糟糕。 我們最好從外部同步`HashMap`。 一個經過深思熟慮的設計將比`Hashtable`表現更好。 哈希表已過時。 最好是使用[**`ConcurrentHashMap`**](https://howtodoinjava.com/java/multi-threading/best-practices-for-using-concurrenthashmap/)類,它們提供更高的并發度。 ## 7\. `Hashtable`與`HashMap` 讓我們快速列出 Java 中`hashmap`和`hashtable`之間的**差異**。 1. `HashMap`不同步。 哈希表已同步。 2. `HashMap`允許一個空鍵和多個空值。 哈希表不允許使用任何`null`鍵或值。 3. `HashMap`很快。 由于增加了同步,哈希表很慢。 4. `HashMap`被`Iterator`遍歷。 `Hashtable`被`Enumerator`和`Iterator`遍歷。 5. `HashMap`中的迭代器是快速失敗的。 `Hashtable`中的枚舉器不是快速失敗的。 6. `HashMap`繼承`AbstractMap`類。 `Hashtable`繼承`Dictionary`類。 ## 8\. 總結 在本教程中,我們了解了 Java `Hashtable`類,其構造器,方法,現實用例,并比較了它們的性能。 我們還了解了`hastable`與 Java 中的`hashmap`有何不同。 不要在新應用程序中使用哈希表。 如果不需要并發,請使用`HashMap`。 在并發環境中,更喜歡使用`ConcurrentHashMap`。 在評論中把您的問題交給我。 學習愉快! 參考: [`Hashtable` Java 文檔](https://docs.oracle.com/javase/10/docs/api/java/util/Hashtable.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看