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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java `Hashmap`教程 > 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-hashmap/](https://javabeginnerstutorial.com/core-java-tutorial/java-hashmap/) Java `HashMap`是基于哈希表的`Map`實現。 這就是為什么面試官總是要求`HashMap`和`HashTable`之間存在差異的原因。 `HashMap`基本上等于`HashTable`,但以下兩個區別除外。 1. 當`HashTable`同步時,`HashMap`不同步。 2. `HashMap`允許為`null`,而`HashTable`不允許為`null`。 ## `HashMap`的重要屬性 | | | | --- | --- | | **`DEFAULT_INITIAL_CAPACITY`** | 默認初始容量(2 的 n 次冪)。 `HashMap`可以包含許多元素。 | | **`MAXIMUM_CAPACITY`** | `HashMap`的最大容量(2 的 n 次冪)。 | | **`loadFactor`** | 定義`HashMap`的閾值。 重新調整大小時將在`HashMap`中發生。 | | **`DEFAULT_LOAD_FACTOR`** | 在`HashMap`的構造器中未定義任何負載因子時將使用。 | | **`size`** | `HashMap`包含的鍵/值對映射數。 | ## 創建`HashMap` 在創建`HashMap`時未定義任何參數時,將使用默認的初始容量(16)和默認的負載系數(0.75)。 該`HashMap`最多可以包含 16 個元素,并且在插入第 13 個元素時會調整`HashMap`的大小。 這是因為負載系數為 75% (.75),并且在添加第 13 個元素(`12 + 1`)時將超過此閾值。 您還可以提供初始容量和`loadFactor`。 但是初始容量不能超過最大容量(2 的 30 次冪),并且負載系數不能為零或負數。 ## `HashMap`中元素的添加 為了添加一個元素,您需要提供 2 個東西:鍵和值。 **鍵**:將與指定值關聯的鍵。 `null`是允許的。 **值**:與指定鍵關聯的值。 首先,`HashMap`將為給定鍵生成一個哈希碼,然后檢查是否已經有與給定鍵相關聯的值。 如果是,則它將返回已經關聯的值。 否則,它將通過提供的鍵在`HashMap`中增加值。 ## 重點 1. `HashMap`不會按`Map`中的元素順序提供任何保證(均值順序會隨時間變化)。 2. `HashMap`為**獲得**和**設置**操作提供恒定時間性能(如果使用正確的哈希算法)。 3. 迭代集合所需的時間與`HashMap`的“**容量**”(它可以容納的元素)和**大小**(它當前容納的元素)成比例。 4. 如果迭代性能更為重要,那么建議不要將初始容量設置得太高而將負載系數設置得太低。 由于性能與*初始容量*和*負載系數*成正比。 * *容量*是哈希表中的存儲桶數。 * 初始容量(默認值為 16)只是創??建哈希表時的容量。 * *負載因子(默認值 .75)*是衡量哈希表在自動增加其容量之前的填充程度的度量。 * 當哈希表中的條目數超過負載因子與當前容量的乘積時,哈希表將被*重映射*(即內部數據結構將被重建)。 5. 使用“`Collections.synchronizedMap()`”方法使映射同步。 6. 由`HashMap`類返回的迭代器為“**故障快速**”。 7. `HashMap`由數組(`Key`)和`LinkedList`(`Value`)支持。 8. `HashMap`使用`hashcode`(使用鍵)來標識應在`HashMap`中放置或檢索對象的確切位置。 9. 最后,`HashCode`返回后備數組中的確切位置(索引)。 10. 支持數組的大小固定。 因此,只要數組已滿(此映射中的鍵數達到其閾值)。 將創建一個具有新容量的新數組,并將所有元素添加到該新數組中。 11. 在兩種情況下(添加和檢索對象)都將使用`HashCode`,而在任何情況下均可以使用或可以不使用`equals()`方法。 12. `HashMap`中`Key`的最佳候選者是具有正確實現`Equals`和`Hashcode`方法的不可變類(示例:字符串類)。 13. 更好的哈希碼和`equals`方法實現是`HashMap`的更好性能。 14. 這樣,所有`String`和原始類型的包裝類將是`HashMap`中鍵的理想選擇。 # 什么是重新哈希 每個`HashMap`都有預定義的大小(初始容量),以及在需要時(超過閾值限制時)增加此大小(負載系數)的邏輯。 **示例**: 使用以下配置創建`HashMap` 初始容量:16(*默認初始容量*) 負載系數:.75(*默認負載系數*) 在給定的`HashMap`中添加第 13 個元素后,超過給定`HashMap`的閾值限制,系統將創建一個新的后備鍵集數組(此數組的大小將是前一個數組的兩倍)。 系統將不得不再次計算確切的存儲桶,應放置上一個存儲桶中的元素,并將舊`HashMap`中的所有元素復制到新的`HashMap`中。 整個過程稱為重新哈希,因為會再次為每個元素計算`Hashcode`。 因為超時的`HashMap`可能會被重新散布并且順序可能會發生變化。 # `HashMap`的示例 在此示例中,您將學到以下幾點 1. 如何迭代映射 2. 迭代映射的不同方法 3. `HashCode`和`Equals`何時被調用。 (請特別注意`HashCode`的輸出和`equals`方法調用) ```java import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class HashMapExample { public static void main(String[] args) { Map<JBT, Integer> m1 = new HashMap<JBT, Integer>(); JBT t1 = new JBT(1, 2); JBT t2 = new JBT(1, 3); JBT t3 = new JBT(2, 1); m1.put(t1, 1); m1.put(t2, 2); m1.put(t3, 3); System.out.println("Addition Done"); /* * Below you can find 3 different ways to iterate a Map. Uncomment * different section and see the different in Output. Pay attention to * when Hashcode and Equals is called */ /* Set s = m1.entrySet(); for (Iterator i = s.iterator(); i.hasNext();) { Map.Entry me = (Map.Entry) i.next(); System.out.println(me.getKey() + " : " + me.getValue()); } */ /* for (Map.Entry<JBT, Integer> entry : m1.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); } */ for (Object key : m1.keySet()) { System.out.println("Key : " + key.toString() + " Value : " + m1.get(key)); } } } class JBT { JBT(int i, int j) { this.i = i; this.j = j; } int i, j; @Override public int hashCode() { System.out.println("Inside HashCode Method"); int k = i + j; return k; } @Override public boolean equals(Object obj) { System.out.println("Inside Equals Method"); if (i == ((JBT) obj).i && j == ((JBT) obj).j) return true; else return false; } @Override public String toString() { return String.valueOf(i).concat(String.valueOf(j)); } } ```
                  <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>

                              哎呀哎呀视频在线观看