一、Map集合的特點
-
Map集合是一個雙列集合
-
Map中的元素,key和value的資料型別可以相同,也可以不同。
-
Map中的元素,key是允許重複的,value是可以重複的
-
Map中的元素,key和value是一一對應的。
二、Map集合與Collection集合的區別
-
Collection中的元素是孤立存在的。
-
Map中的元素是成對存在的。每個元素由鍵與值兩部分組成,通過鍵可以找到對應額值。
-
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集合遍歷鍵找值方式
步驟:
-
用keySet獲取所有的鍵儲存到Set集合中
-
遍歷儲存鍵的Set集合,得到每一個鍵
-
用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集合遍歷鍵值對方式
步驟:
-
獲取Map集合中,所有的鍵值對物件(Entry),以Set集合的方式返回;
-
遍歷Set集合,得到每一個鍵值對物件;
-
通過鍵值對物件,獲取鍵值對中的鍵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);
注意:
-
of() 方法只是 List、Set、Map 這三個介面的靜態方法,其父類介面或子類介面並沒有這類方法,比如 HashSet ,ArrayList 等等。
-
返回的集合是不可變的。