一、Map基本介紹
java.util.Map接口是一個存儲鍵值對的集合,每個鍵對應一個值,鍵和值可以是任意類型,但是鍵不能重複。Map接口有多種實現,如HashMap、TreeMap、HashTable等。
其中HashMap是最常用的一種實現方式。HashMap底層實現是基於數組和鏈表的數據結構。它通過把鍵的hashCode()值和數組長度取余,然後把鍵值對保存在對應的數組下標中。如果多個鍵的hashCode()值取余後對應同一個下標,那麼在這個下標上使用鏈表將鍵值對串起來,形成一個鏈表,查找時要遍歷這個鏈表。
代碼示例:
//創建一個HashMap Map<String, Integer> map = new HashMap<>(); //向map中添加鍵值對 map.put("apple", 1); map.put("banana", 2); //獲取map中的值 int value = map.get("apple"); //遍歷map中的鍵值對 for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); }
二、Map常用操作
1、添加鍵值對
通過put(key, value)方法向Map中添加鍵值對。如果Map中已經存在該鍵,則會將原來的值覆蓋。
代碼示例:
Map<String, Integer> map = new HashMap<>(); //添加鍵值對 map.put("apple", 1); map.put("banana", 2);
2、獲取鍵值對
通過get(key)方法獲取Map中指定鍵對應的值。
代碼示例:
Map<String, Integer> map = new HashMap<>(); //添加鍵值對 map.put("apple", 1); map.put("banana", 2); //獲取鍵值對 int value = map.get("apple");
3、判斷鍵是否存在
通過containsKey(key)方法判斷Map中是否存在指定的鍵。
代碼示例:
Map<String, Integer> map = new HashMap<>(); //添加鍵值對 map.put("apple", 1); map.put("banana", 2); //判斷鍵是否存在 boolean containsKey = map.containsKey("apple");
4、遍歷Map
通過entrySet()方法獲取Map中所有的鍵值對,然後遍歷這個集合即可。
代碼示例:
Map<String, Integer> map = new HashMap<>(); //添加鍵值對 map.put("apple", 1); map.put("banana", 2); //遍歷鍵值對 for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); }
三、HashMap與ConcurrentHashMap的區別
HashMap是非線程安全的,如果多個線程同時訪問一個HashMap實例,可能會導致數據不一致的問題。而ConcurrentHashMap則是線程安全的,它採用了分段鎖的機制,將整個Map分成多個小的區域,每個區域有自己的鎖,這樣多個線程在訪問不同的區域時不會相互影響,從而保證線程安全。
代碼示例:
//創建一個HashMap Map<String, Integer> hashMap = new HashMap<>(); //創建一個ConcurrentHashMap Map<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
四、Map遍歷性能比較
在遍歷Map時,常見的遍歷方式有通過entrySet()方法遍歷和通過keySet()方法遍歷。但是這兩種方式的性能存在一定的差異。
entrySet()方式在遍歷Map時,每次獲取鍵值對時需要同時獲取鍵和值,會產生一定的性能損耗。而keySet()方式只獲取鍵,效率更高。
代碼示例:
Map<String, Integer> map = new HashMap<>(); //添加鍵值對 map.put("apple", 1); map.put("banana", 2); //通過entrySet()方式遍歷Map long start1 = System.currentTimeMillis(); for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } long end1 = System.currentTimeMillis(); //通過keySet()方式遍歷Map long start2 = System.currentTimeMillis(); for (String key : map.keySet()) { Integer value = map.get(key); System.out.println(key + " : " + value); } long end2 = System.currentTimeMillis(); System.out.println("entrySet()方式遍歷Map耗時:" + (end1 - start1) + "ms"); System.out.println("keySet()方式遍歷Map耗時:" + (end2 - start2) + "ms");
原創文章,作者:QIVA,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/141874.html