HashMap是Java中最常用的Map介面的實現之一。它提供了一種快速的查找方式,並且插入和刪除操作也比較高效。HashMap的內部實現是基於哈希表,它將鍵值對映射到一個固定長度的數組中。當需要查找一個特定的鍵值對時,首先需要計算哈希碼,然後定位到對應的桶(bucket),最後在桶中查找對應的值。
一、HashMap簡介
HashMap是Java中最常用的Map介面的實現之一。它允許存儲鍵值對,並且用Key來取得Value,Key在HashMap中必須是獨一無二的,Value則可以重複。Key和Value都可以為null。
HashMap的實現方法是採用哈希表,它是將Key映射到一個固定長度的數組中,這個數組就是哈希表的主空間。當需要查找一個特定的鍵值對時,首先需要計算哈希碼,然後定位到對應的桶(bucket),最後在桶中查找對應的值。因為哈希碼的範圍往往大於數組的長度,所以可能會出現不同的鍵值對具有相同的哈希碼的情況,這就是哈希衝突,HashMap使用鏈表來解決這個問題,即如果兩個鍵值對具有相同的哈希碼,就將它們存儲在同一個桶中的鏈表中。
二、HashMap的常用操作
1. 創建HashMap
創建一個HashMap可以通過默認構造函數或者帶有初始容量和負載因子的構造函數實現。如果不指定初始容量和負載因子,則使用默認值(初始容量為16,負載因子為0.75)。
Map<String,Integer> hashMap = new HashMap<>(); Map<String,Integer> hashMap = new HashMap<>(20); Map<String,Integer> hashMap = new HashMap<>(20, 0.8f);
2. 添加鍵值對
在HashMap中添加鍵值對可以使用put()方法。如果新的鍵值對的鍵已經存在,則會用新的值覆蓋原有的值。
Map<String,Integer> hashMap = new HashMap<>(); hashMap.put("apple", 10); hashMap.put("orange", 20); hashMap.put("banana", 30);
3. 獲取值
使用get()方法可以獲取HashMap中指定鍵對應的值,如果鍵不存在,就返回null。
Map<String,Integer> hashMap = new HashMap<>(); hashMap.put("apple", 10); Integer value = hashMap.get("apple"); System.out.println(value); // 輸出:10
4. 移除鍵值對
可以使用remove()方法來移除HashMap中指定鍵對應的鍵值對,如果鍵不存在,就不會有任何影響。
Map<String,Integer> hashMap = new HashMap<>(); hashMap.put("apple", 10); hashMap.put("orange", 20); hashMap.put("banana", 30); hashMap.remove("orange");
5. 判斷鍵是否存在
可以使用containsKey()方法來判斷HashMap中是否包含指定的鍵。
Map<String,Integer> hashMap = new HashMap<>(); hashMap.put("apple", 10); boolean contains = hashMap.containsKey("apple"); System.out.println(contains); // 輸出:true
三、HashMap的使用
1. 存儲學生成績
以下是一個示例代碼,用HashMap存儲學生成績。
Map<String,Double> scoreMap = new HashMap<>(); scoreMap.put("張三", 80.5); scoreMap.put("李四", 90.0); scoreMap.put("王五", 70.5); scoreMap.put("趙六", 95.0); System.out.println("張三的成績是" + scoreMap.get("張三"));
輸出結果為:
張三的成績是80.5
2. 統計單詞出現的次數
以下是一個示例代碼,用HashMap統計一段英文文本中每個單詞出現的次數。
String text = "Good morning. Have a good class. Have a good visit. Have fun!"; String[] words = text.toLowerCase().split("[^a-zA-Z]+"); Map<String,Integer> wordCountMap = new HashMap<>(); for (String word : words) { if (wordCountMap.containsKey(word)) { wordCountMap.put(word, wordCountMap.get(word) + 1); } else { wordCountMap.put(word, 1); } } for (Map.Entry<String,Integer> entry : wordCountMap.entrySet()) { System.out.println(entry.getKey() + "出現了" + entry.getValue() + "次"); }
輸出結果為:
a出現了3次 class出現了1次 fun出現了1次 good出現了3次 have出現了3次 morning出現了1次 visit出現了1次
3. 實現LRU緩存
以下是一個示例代碼,用HashMap實現一個LRU(least recently used)緩存,其中最多存儲10個鍵值對,並且當緩存滿時,清除最近最少使用的鍵值對。
class LRUMap<K,V> extends LinkedHashMap<K,V> { private final int maxSize; public LRUMap(int maxSize) { super(maxSize + 1, 1.0f, true); this.maxSize = maxSize; } @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() > maxSize; } } public static void main(String[] args) { Map<Integer,Integer> map = new LRUMap<>(10); for (int i = 0; i < 20; i++) { map.put(i, i); System.out.println("插入鍵" + i + ",當前map:" + map); } }
輸出結果為:
插入鍵0,當前map:{0=0} 插入鍵1,當前map:{0=0, 1=1} 插入鍵2,當前map:{0=0, 1=1, 2=2} 插入鍵3,當前map:{0=0, 1=1, 2=2, 3=3} 插入鍵4,當前map:{0=0, 1=1, 2=2, 3=3, 4=4} 插入鍵5,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5} 插入鍵6,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6} 插入鍵7,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7} 插入鍵8,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8} 插入鍵9,當前map:{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9} 插入鍵10,當前map:{1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10} 插入鍵11,當前map:{2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11} 插入鍵12,當前map:{3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12} 插入鍵13,當前map:{4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13} 插入鍵14,當前map:{5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14} 插入鍵15,當前map:{6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15} 插入鍵16,當前map:{7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16} 插入鍵17,當前map:{8=8, 9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17} 插入鍵18,當前map:{9=9, 10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17, 18=18} 插入鍵19,當前map:{10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17, 18=18, 19=19}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/192884.html