JAVA類別-HashMap

HashMap概述

官方文件:

https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

當我們執行下面的操作時:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HashMap <String,Integer> map = new HashMap <String,Integer>();
map.put(“語文”,1);
map.put(“數學”,2);
map.put(“英語”,3);
map.put(“歷史”,4);
map.put(“政治”,5);
map.put(“地理”,6);
map.put(“生物”,7);
map.put(“化學”,8);
for(Entry <String,Integer> entry:map.entrySet()){
System.out.println(entry.getKey()+ “:” + entry.getValue());
}HashMap <String,Integer> map = new HashMap <String,Integer>();
map.put(“語文”,1);
map.put(“數學”,2);
map.put(“英語”,3);
map.put(“歷史”,4);
map.put(“政治”,5);
map.put(“地理”,6);
map.put(“生物”,7);
map.put(“化學”,8);
for(Entry <String,Integer> entry:map.entrySet()){
System.out.println(entry.getKey()+ “:” + entry.getValue());
}

執行結果

1
2
3
4
5
6
7
8
政治:5
生物:7
歷史:4
數學:2
化學:8
語文:1
英語:3
地理:6

下面是一個大致的結構:
HashMap中
hm1

HashMap資料結構

簡介:
在資料處理時我們常常需要 (key, value) 的對應
先前在將List做排序的方法也是為了類似的目的
當初利用List是因為我們不需要由key去取得value的功能
只需要把所有資料依某個欄位排序全部印出即可
在這種情況底下自己建立所需資料型態的物件List會比較方便

然而有時候我們需要的是針對某個鍵值提出對應的資料
以成績單舉例好了 當我們的目的只是要列印成績單
那麼用List去做會是一個不錯的選擇
可是在List的結構底下若是我們只想得到某一學生的成績
那我們就得在List裡頭搜尋這個學生的名字然後才能得到成績
面對這種狀況另一個方法就是利用HashMap

把資料的 (key, value) 放入HashMap以後要針對特定的key取得value是非常簡單的
可以參考最下面程式碼裡面單純取得成績那段
如果HashMap裡頭有儲存資料則會傳回對應該key的value
HashMap裡沒有資料的話則會傳回 null

在HashMap裡資料的排列與key、value、加入順序都無關
HashMap有自己獨特的排列方式,像程式碼第二段的輸出結果
若是想讓資料以key值排序可以選擇用TreeMap 但效能是HashMap較佳

利用HashMap我們已經達到可以利用key值迅速取得value
但是如果我們想要印出所有資料卻又不知道姓名怎麼辦呢?
這時候只好利用HashMap的entrySet()方法取得所有資料
然後把這些資料匯入List中做處理
只要資料匯入List後就可以依照key或value排序印出了
如程式碼第三四段

在看程式碼和結果前先下個簡短的結論
如果是單純的想列印全部資料或者欄位不只兩個
那麼就建立一個自訂class的List來處理會比較方便
如同將List做排序的方法所介紹的
但如果資料只是兩欄 (key, value) 的配對
則用HashMap可以迅速取得單一key對應的資料

特性:
資料(K, V)原則上是一對一
key不能重複,若重複宣告,後者會取代前者
資料不會排序,預設是先宣告的在前面(呼叫整個 HashMap 的話)

用途:
建立對應表(轉換表),一 key 對一 value
像是學生成績表,以名字做為 key,查詢 key 可以得對應的成績 value

資料格式:

1
2
3
HashMap<K,V>
K: key
V: value

HashMap用法

  1. 宣告: 型別是 reference,不能存基本型別,像整數要寫 Integer 而非 int

    1
    2
    3
    HashMap<String, String> hashmap = new HashMap<String, String>();
    HashMap<String, String> hashmap = new HashMap<>();
    HashMap<String, Integer> hashmap = new HashMap<>();
  2. 新增資料: 同時給Key-Value參數,新增這筆資料到該hashMap

    1
    2
    hashmap.put("Item 1", "Value 1");
    hashmap.put("Item 1", 25);
  3. 刪除資料: 根據參數Key刪掉對應的Key-Value資料

    1
    hashmap.remove("Item 1");
  4. 取特定key對應的值

    1
    hashmap.get("Item 1");
  5. 顯示整個HashMap內容

    1
    2
    3
    4
    System.out.println("內容:" + hashmap);
    for(String Key: map.keySet()){
    System.out.println(Key + " " + hashmap.get(Key));
    }
  6. 清空HashMap: 刪除整個HashMap內容,物件還在,但沒有東西

    1
    hashmap.clean();
  7. 補充:
    如果想要此 map 可以1對多的話(1 key 對應多個 value)
    value 的型別可以用 ArrayList
    好處在value可以使用所有 ArrayList 的功能
    宣告:

    1
    HashMap<> hashmap = new HashMap<>();

每個key對應都是一個ArrayList,放數值前要先初始化:

1
2
hashmapmap.put("Item 1", new ArrayList<>());
hashmapmap.put("Item 2", new ArrayList<>());

新增數值:用get得到ArrayList物件,再用他的add方法新增

1
2
hashmap.get("Item 2").add("d");
hashmap.get("Item 2").add("e");

刪除某個key的所有value: 下次要用此key時要再次初始化

1
hashmap.remove("Item 2");

刪除某個key的特定value

1
hashmap.get("Item 2").remove("d");

Reference: