一、基礎概念
Javamapget是Java中常用的Map的獲取元素的方法,基於鍵值對的Map在Java開發中被廣泛應用,在很多場景下需要通過鍵值對找到對應的元素,這時我們就需要使用Map的get方法。
get方法接收一個鍵值作為參數,返回其對應的值。若Map中不存在該鍵值,則返回null。
Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2); map.put("orange", 3); Integer value = map.get("banana"); System.out.println(value);//輸出2
上述代碼創建了一個鍵值對為String和Integer的HashMap,並向其中添加了apple、banana、orange三個鍵和對應的值。接着通過map.get方法獲取了鍵為banana的值,並輸出結果。
二、使用注意事項
1. 鍵值類型需重寫hashCode和equals方法
在使用Map的時候需要確保存儲的鍵值類型已經正確重寫了hashCode和equals兩個方法。在Map內部,會根據鍵值對的hashCode來定位元素,當hashCode相同時,系統會調用equals方法進一步判斷是否相等,因此,當我們自定義類型作為鍵值時,需要確保這兩個方法的正確實現。
public class Student { private String name; private int age; //省略getter、setter方法以及其他成員變量和方法 @Override public int hashCode() { return Objects.hash(name, age); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Student student = (Student) obj; return age == student.age && Objects.equals(name, student.name); } } Map<Student, Integer> map = new HashMap<>(); map.put(new Student("Tom", 18), 1); map.put(new Student("Mary", 20), 2); map.put(new Student("Lucy", 18), 3); Integer value = map.get(new Student("Tom", 18)); System.out.println(value);//輸出1
上述代碼中定義了一個Student類,並在其中重寫了hashCode和equals方法。接下來創建一個存儲Student和Integer類型的HashMap,並向其中添加了三個元素。接着通過map.get方法獲取鍵值為new Student(“Tom”, 18)的對應的值,並輸出結果。
2. 必須保證鍵值唯一且不為null
Map中的鍵值對應關係是一一對應的,每個鍵只能對應一個值。如果添加了重複的鍵,則後面的值會覆蓋前面的值。如果鍵為null,可能會導致NullPointerException異常。
Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("orange", 2); map.put("banana", 3); map.put("banana", 4); System.out.println(map.get("banana"));//輸出4 System.out.println(map.get(null));//輸出null
上述代碼向一個存儲String和Integer類型的HashMap中添加了多個元素,包括一個重複的鍵值和一個鍵為null的元素。由於HashMap只能存儲唯一的鍵值,因此最後輸出的結果為4和null。
三、常見問題解決
1. Map中的元素順序不可預知
Java中的Map並不保證元素的存儲順序。因此,在使用Map的時候,不能依賴於元素的順序。如果需要按照鍵值順序訪問元素,可以使用TreeMap類型。
Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2); map.put("orange", 3); for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); }
上述代碼通過一個for循環遍歷HashMap中的所有元素,並輸出其鍵值。
2. 在多線程環境下調用Map的方法可能引起線程安全問題
HashMap是非線程安全的,也就是說,在多個線程同時調用HashMap的方法會導致競爭條件的出現,從而引發數據異常或者程序錯誤。在多線程環境下,通常使用ConcurrentHashMap類型,或者將HashMap轉換為線程安全的類型。
Map<String, Integer> map = new ConcurrentHashMap<>(); map.put("apple", 1); map.put("banana", 2); map.put("orange", 3); Thread thread1 = new Thread(() -> { for (int i = 0; i < 10000; i++) { Integer value = map.get("apple"); if (value == null) { map.put("apple", 1); } else { map.put("apple", value + 1); } } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 10000; i++) { Integer value = map.get("apple"); if (value == null) { map.put("apple", 1); } else { map.put("apple", value + 1); } } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println(map.get("apple"));
上述代碼中創建了一個ConcurrentHashMap,並向其中添加了多個元素。為了演示HashMap引發的線程安全問題,我們對HashMap進行了多線程測試。由於ConcurrentHashMap是線程安全的,因此即使在多線程條件下,也可以保證程序的正確性。
原創文章,作者:LDDZO,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370326.html