Map集合筆記

水啾2發表於2021-07-21

一、Map集合的特點

  1. Map集合是一個雙列集合

  2. Map中的元素,key和value的資料型別可以相同,也可以不同。

  3. Map中的元素,key是允許重複的,value是可以重複的

  4. Map中的元素,key和value是一一對應的。

 

二、Map集合與Collection集合的區別

  1. Collection中的元素是孤立存在的。

  2. Map中的元素是成對存在的。每個元素由鍵與值兩部分組成,通過鍵可以找到對應額值。

  3. Map集合不能直接使用迭代器或者增強迴圈,但是轉成Set集合之後可以使用迭代器和增強迴圈。

 

三、Map集合的常用方法

  • public V put(K key , V value):新增元素,若key不存在則返回null;若key存在則返回替換之前的值,並把原來的值替換為引數值。

  • public V remove(Object key):刪除

  • public V get(Object key):獲取指定鍵對應的值

  • public set<k> keySet():獲取Map集合中的所有的值,儲存到Set集合中。

  • public set<Map.Entry<K,v> > entrySet():獲取到Map集合中所有的鍵值對物件的Set集合。

  • public containsKey(Object key):判斷集合中是否包含指定的鍵。

 

四、Map集合的常用子類

  • HashMap:儲存資料採用雜湊表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重複,需要重寫hashCode方法和equals方法。

  • LinkedHashMap:extends HashMap 。儲存資料採用雜湊表+連結串列結構。通過連結串列結構可以保證元素的存取順序一致。通過雜湊表結構可以保證鍵的唯一、不重複。需要重寫hashCode方法和equals方法。

  • Properties:java.util.Properties<String  ,String v> extends Hashtable<K,V> implements Map<K,V> 。唯一一個與IO流結合的集合,表示了一個持久的屬性集。Java中的File類與常用IO流,第七章 Properties

 

五、重寫hashCode方法與equals方法

 1 @Override
 2 public boolean equals(Object o) {
 3  if (this == o)
 4    return true;
 5 
 6  if (o == null || getClass() != o.getClass())
 7    return false;
 8 
 9  Student student = (Student) o;
10  return age == student.age && Objects.equals(name,student.name);
11 }
1 @Override
2 public int hashCode() {
3  return Objects.hash(name, age);
4 }

六、Map集合遍歷鍵找值方式

步驟:

  1. 用keySet獲取所有的鍵儲存到Set集合中

  2. 遍歷儲存鍵的Set集合,得到每一個鍵

  3. 用get(K key),根據鍵獲取對應的值。

程式碼演示:

 1 //建立Map集合物件 
 2 HashMap<String, String> map = new HashMap<String,String>();
 3 //新增元素到集合 
 4 map.put("一班", "大明");
 5 map.put("二班", "二明");
 6 map.put("三班", "三明");
 7 
 8 //第一步,獲取所有的鍵  獲取鍵集
 9 Set<String> keys = map.keySet();
10 //第二步, 遍歷鍵集 得到 每一個鍵
11 for (String key : keys) {
12       //第三部,獲取對應值
13     String value = map.get(key);
14     System.out.println(key+"的:"+value);
15 }

七、Entry鍵值對物件

Map中存放的是兩種物件,一種為key ,一種為 value ,它們在 Map中是一一對應的關係,這一對物件又稱作 “Map中的一個項(Entry)”。Entry將鍵值對的對應關係封裝成了物件。即鍵值對物件。

 

  • public Set<Map.Entry<K,V> > entrySet():獲取map集合所有鍵值對的物件的Set集合。

 

 

  • public K getKey():獲取Entry物件中的鍵

  • public V getValue():獲取Entry物件中的值

 

 

注意:Map集合不能直接使用迭代器或者增強迴圈進行遍歷,但是轉成
Set之後就可以使用了。

 

八、Map集合遍歷鍵值對方式

步驟:

  1. 獲取Map集合中,所有的鍵值對物件(Entry),以Set集合的方式返回;

  2. 遍歷Set集合,得到每一個鍵值對物件;

  3. 通過鍵值對物件,獲取鍵值對中的鍵getKey()與值getValue()。

程式碼示例:

 1 // 建立Map集合物件 
 2 HashMap<String, String> map = new HashMap<String,String>();
 3 // 新增元素到集合 
 4 map.put("一班", "大明");
 5 map.put("二班", "二明");
 6 map.put("三班", "三明");
 7 
 8 // 獲取 所有的 entry物件  entrySet
 9 Set<Entry<String,String>> entrySet = map.entrySet();
10 
11 // 遍歷得到每一個entry物件
12 for (Entry<String, String> entry : entrySet) {
13     // 解析 
14     String key = entry.getKey();
15     String value = entry.getValue();  
16     System.out.println(key+"的:"+value);
17 }

九、HashMap儲存自定義型別鍵值

 1 public class Student {
 2     private String name;
 3     private int age;
 4 
 5     public Student() {
 6     }
 7 
 8     public Student(String name, int age) {
 9         this.name = name;
10         this.age = age;
11     }
12 
13     public String getName() {
14         return name;
15     }
16 
17     public void setName(String name) {
18         this.name = name;
19     }
20 
21     public int getAge() {
22         return age;
23     }
24 
25     public void setAge(int age) {
26         this.age = age;
27     }
28 
29     @Override
30     public boolean equals(Object o) {
31         if (this == o)
32             return true;
33         if (o == null || getClass() != o.getClass())
34             return false;
35         Student student = (Student) o;
36         return age == student.age && Objects.equals(name, student.name);
37     }
38 
39     @Override
40     public int hashCode() {
41         return Objects.hash(name, age);
42     }
43 }
 1 public class HashMapTest {
 2     public static void main(String[] args) {
 3         //1,建立Hashmap集合物件。
 4         Map<Student,String>map = new HashMap<Student,String>();
 5         //2,新增元素。
 6         map.put(newStudent("lisi",28), "上海");
 7         map.put(newStudent("wangwu",22), "北京");
 8         map.put(newStudent("zhaoliu",24), "成都");
 9         map.put(newStudent("zhouqi",25), "廣州");
10         map.put(newStudent("wangwu",22), "南京");
11         
12         //3,取出元素。鍵找值方式
13         Set<Student>keySet = map.keySet();
14         for(Student key: keySet){
15             Stringvalue = map.get(key);
16             System.out.println(key.toString()+"....."+value);
17         }
18     }
19 }

* 當給HashMap中存放自定義物件時,如果自定義物件作為key存在,這時要保證物件唯一,必須複寫物件的hashCode和equals方法。

* 如果要保證map中存放的key和取出的順序一致,可以使用`java.util.LinkedHashMap`集合來存放。

 

十、LinkedHashMap

HashMap保證成對元素唯一,並且查詢速度很快,可是成對元素存放進去是沒有順序的,那麼我們要保證有序,還要速度快怎麼辦呢?

在HashMap下面有一個子類LinkedHashMap,它是連結串列和雜湊表組合的一個資料儲存結構。

 

程式碼示例:

 1 public class LinkedHashMapDemo {
 2     public static void main(String[] args) {
 3         LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
 4         map.put("一班", "大明");
 5         map.put("三班", "三明");
 6         map.put("二班", "二明");
 7         Set<Entry<String, String>> entrySet = map.entrySet();
 8         for (Entry<String, String> entry : entrySet) {
 9             System.out.println(entry.getKey() + "  " + entry.getValue());
10         }
11     }
12 }

執行結果顯示,存取順序是一致的。

 

十一、集合補充:JDK9對集合新增的優化

在沒有使用集合工廠之前,通常要新增幾個元素,就要幾次add方法或put方法。

使用集合工廠:方便建立少量元素的集合、map例項:

  • List.of(str1,str2,str3);

  • Set.of(str1,str2,str3);

  • Map.of(str1,str2,str3);

 

注意:

  1. of() 方法只是 List、Set、Map 這三個介面的靜態方法,其父類介面或子類介面並沒有這類方法,比如 HashSet ,ArrayList 等等。

  2. 返回的集合是不可變的。

 

相關文章