CodeGym /Java Blog /Toto sisi /HashMap:這是一個什麼樣的映射?
John Squirrels
等級 41
San Francisco

HashMap:這是一個什麼樣的映射?

在 Toto sisi 群組發布
你好!在本課中,我們將仔細回顧Java HashMap。之前,我們研究了元素作為自身存儲的數據結構。在數組或ArrayList / LinkedList中,我們存儲了一些元素。但是,如果我們的任務發生一點變化怎麼辦?
HashMap:這是一個什麼樣的映射? - 1
設想以下任務:創建一個包含 100 人的列表,其中存儲每個人的姓名和護照號碼。原則上,這並不難。例如,您可以將兩者都填充到一個字符串中,然後創建這些字符串的列表: “Amelia Aguilar, 4211 717171”。 但是這個解決方案有兩個缺點。首先,我們可能需要能夠通過護照號碼進行搜索。考慮到這種信息存儲格式,這將是有問題的。其次,沒有什麼能阻止我們用相同的護照號碼創造兩個不同的人。這是我們解決方案最嚴重的缺點。這是絕對不允許的:沒有兩個人擁有相同的護照號碼。一個新的數據結構來幫助我們:地圖. 它也被稱為“關聯數組”,但這個術語很少使用。更常見的是,它被稱為“字典”或“地圖”。:) 它與我們之前考慮的數據結構有何根本不同?最重要的是,Map 中的數據存儲為鍵值對。任何東西都可以作為鍵和值:數字、字符串或其他類的對象。今天我們將研究Map類最常見的實現:Java HashMapHashMap:這是一個什麼樣的映射? - 2

那麼,關於Java中的HashMap,我們需要了解什麼呢?

創建非常容易:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
這裡我們創建一個字典,將元素存儲為“數字-字符串”對。數字將作為鍵,字符串作為值。我們還指定鍵類型(整數)和值類型(字符串)。為什麼?首先,HashMap鍵始終是唯一的。這非常適合我們,因為我們可以使用護照號碼作為密鑰並避免重複。該值將是一個帶有全名的字符串(不同的人可以有相同的名字;我們不用擔心)。向HashMap添加一個新對看起來像這樣:

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
為此, 我們使用方法put() 。此外,HashMap重寫了toString()方法,因此可以顯示在控制台上。輸出將如下所示: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} 現在讓我們驗證密鑰是否真的唯一?讓我們嘗試使用已在地圖中 使用過的鍵添加一個新元素:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
輸出: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} 如您所見,與密鑰162348關聯的先前值已​​被覆蓋。我們使用術語“密鑰”是有原因的。HashMap中的值是使用鍵訪問的,反之則不行。無法使用值獲取鍵,因為值可能不是唯一的。從HashMap獲取或刪除元素時可以清楚地看到這一點:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
要從字典中獲取一個值或刪除一對,我們必須將與該值對應的唯一鍵傳遞給get()remove() 。與數組和列表不同, Java 中的HashMap沒有數字索引:使用鍵訪問值。控制台輸出: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} ArrayList和LinkedList類讓我們檢查列表是否包含任何特定元素。 Java HashMap讓我們可以做到這一點。更重要的是,我們可以為該對的兩個成員執行此操作:這就是 containsKey ()(檢查密鑰)和containsValue()(檢查一個值)方法是為了。

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
輸出: false true J​​ava 中 HashMap 的另一個方便的特性是您可以獲得所有鍵和所有值的單獨列表。這是通過keySet()values()方法完成的:

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
鍵被提取到我們尚未介紹的Set中。它的特殊之處在於它不能包含重複元素。現在最主要的是要記住,所有鍵的列表都可以從 HashMap 中檢索一個單獨的集合中。在示例中,我們將值保存到一個普通的ArrayList中。控制台輸出: Keys: [212133, 8082771, 162348] Values: [Bridget Logan, Donald John Trump, Ivan the Great] size ()clear()方法做的事情與我們之前討論的結構完全相同:第一個返回字典中當前元素的數量,第二個刪除所有元素。

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
Output: 3 {}要檢查我們的HashMap 中是否至少有一個元素,我們可以使用isEmpty()方法:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
輸出: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} 現在我們只在初步檢查後輸出到控制台。:) 另一個有趣的地方是兩個地圖可以合併為一個。這是使用putAll()方法完成的。我們在第一個HashMap上調用它,將第二個作為參數傳遞,並將第二個的元素添加到第一個:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
輸出: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan the Great} passportsAndNames2 中的所有 對都已復製到passportsAndNames中。現在考慮一個更複雜的例子。具體來說,在循環中 迭代HashMap 。

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry類表示字典中鍵值對。entrySet ()方法返回我們的HashMap中所有對的列表。因為我們的地圖由這些Map.Entry對組成,所以我們迭代對,而不是單獨的鍵或值。輸出: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan the Great 另外,不要忘記研究HashMap的官方Oracle文檔。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION