一. Map集合
1.1 概述
上一篇博客提到了集合按照其存儲結構可以分爲兩大類,分別是單列集合java.util.Collection
和雙列集合java.util.Map
單例集合在上一篇博客已經總結,現在對雙列集合Map進行總結。
java.util.Map<k,v>集合
Map集合的特點:
1.Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)
2.Map集合中的元素,key和value的數據類型可以相同也可以不同
3.Map集合中的元素,key是不允許重複的,value是可以重複的
4.Map集合中的元素,key和value是一一對應
1.2 Map常用子類
HashMap<K,V>:存儲數據採用哈希表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
java.util.HashMap<k,v>集合 implements Map<k,v>接口
HashMap集合的特點:
1.HashMap集合底層是哈希表:查詢的速度特別快
JDK1.8之前:數組+單向鏈表
JDK1.8之後:數組+單向鏈表/紅黑樹(鏈表的長度超過8) 提高查詢速度
2.hashMap集合是一個無序的集合,存儲元素和取出順序有可能不一致
3.HashMap集合只允許一條記錄的鍵爲NULL,TreeMap不允許鍵爲空
LinkedHashMap<K,V>:HashMap下有個子類LinkedHashMap,存儲數據採用的哈希表結構+鏈表結構。通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。
java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
LinkedHashMap的特點集合底層是哈希表+鏈表
1.LinkedHashMap的底層是哈希表+鏈表(保證了迭代的順序)
2.LinkedHashMap集合是一個有序的集合,存儲元素和取出元素的順序是一致的
1.3 Map接口中常用方法
- public V put(K key, V value) 把指定的鍵與指定的值添加到Map集合中。
- public V remove(Object key) 把指定的鍵 所對應的鍵值對元素 在Map集合中刪除,返回被刪除元素的值。
- public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。
- boolean containsKey(Object key) 判斷集合中是否包含指定的鍵。
- public Set<K> keySet() 獲取Map集合中所有的鍵,存儲到Set集合中。
- public Set<Map.Entry<K,V>> entrySet() 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
/*
public V put(K key, V value)
返回值:V
存儲"鍵值對"的時候,key不重複,返回值V是null
存儲"鍵值對"的時候,key重複,會使用新的value替換map中重複的value,返回被替換的value值
*/
Map<String, Integer> map = new HashMap<>();//創建 map對象
//添加元素到集合
map.put("科比", "24");
map.put("詹姆斯", "23");
System.out.println(map); //{科比=24,詹姆斯=23}
/*
public V remove(Object key)
返回值:V
key存在,V返回被刪除的值
key不存在,V返回null
*/
Integer v1 = map.remove("科比");
System.out.println("v1:"+v1); //24
/*
public V get(Object key)
返回值:V
key存在,返回對應的value值
key不存在,返回null
*/
Integer v2 = map.get("詹姆斯");
System.out.println("v2:"+v2);
提示:
使用put方法時,若指定的鍵(key)在集合中沒有,則沒有這個鍵對應的值,返回null,並把指定的鍵值添加到集合中;
若指定的鍵(key)在集合中存在,則返回值爲集合中鍵對應的值(該值爲替換前的值),並把指定鍵所對應的值,替換成指定的新值。
1.4 Map集合遍歷“鍵找值”方式
第一種:鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值
分析步驟:
-
獲取Map中所有的鍵,由於鍵是唯一的,所以返回一個Set集合存儲所有的鍵。使用:
keyset()
-
遍歷鍵的Set集合,得到每一個鍵。
-
根據鍵,獲取鍵所對應的值。使用:
get(K key)
//1.使用Map集合中的方法KeySet(),把Map集合所有的key取出來,存儲到一個Set集合中
Set<String> set = map.keySet();
//2.使用迭代器遍歷Set集合
Iterator<String> it = set.iterator();
while(it.hasNext()){
String key = it.next();
//3.通過Map集合中的方法get(key),通過key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
System.out.println("==========");
//使用增強for遍歷Set集合
for(String key : set){ //也可以直接使用map.keySet()得到set集合
//3.通過Map集合中的方法get(key),通過key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
1.5 Entry鍵值對對象
Map
中存放的是兩種對象,一種稱爲key(鍵),一種稱爲value(值),它們在在Map
中是一一對應關係,這一對對象又稱做Map
中的一個Entry(項)
。Entry
將鍵值對的對應關係封裝成了對象。即鍵值對對象,這樣我們在遍歷Map
集合時,就可以從每一個鍵值對(Entry
)對象中獲取對應的鍵與對應的值。
-
public K getKey()
:獲取Entry對象中的鍵。 -
public V getValue()
:獲取Entry對象中的值。
在Map集合中也提供了獲取所有Entry對象的方法:
-
public Set<Map.Entry<K,V>> entrySet()
: 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
1.6 Map集合遍歷鍵值對
第二種:鍵值對方式:即通過集合中每個鍵值對(Entry)對象,獲取鍵值對(Entry)對象中的鍵與值。
實現步驟:
1.使用Map集合中的方法entrySet(),把集合中多個Entry對象取出來,存儲到一個Set集合中
2.遍歷Set集合,獲取每一個Entry對象
3.使用Entry對象中的方法getKey()和getValue()獲取健與值
//1.使用Map集合中的方法entrySet(),把集合中多個Entry對象取出來,存儲到一個Set集合中
Set<Map.Entry<String,Integer>> set = map.entrySet();
//2.遍歷Set集合,獲取每一個Entry對象
//使用迭代器遍歷Set集合
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while(it.hasNext()){
Map.Entry<String,Integer> entry = it.next();
//3.使用Entry對象中的方法getKey()和getValue()獲取健與值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
for (Map.Entry<String,Integer> entry:set) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
1.7 HashMap存儲自定義類型鍵值
HashMap存儲自定義類型鍵值
Map集合保證key是唯一的:
當給HashMap中存放自定義對象時,如果自定義對象作爲key存在,
這時要保證對象唯一,必須複寫對象的hashCode和equals方法。
/*
HashMap存儲自定義類型鍵值
key:Person類型
Person類就必須重寫hashCode和equals方法,可以保證key唯一
value:String類型
可以重複
*/
private static void show(){
//創建HashMap集合
HashMap<Person,String> map = new HashMap<>();
//往集合中添加元素
map.put(new Person("王五",18),"英國");
map.put(new Person("張三",18),"秦國");
map.put(new Person("李四",60),"中國");
map.put(new Person("王五",18),"毛里求斯");
//使用entrySet和增強for遍歷Map集合
Set<Map.Entry<Person,String>> set = map.entrySet();
for(Map.Entry<Person,String> entry:set){
Person key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"->"+value);//Person{name='女王', age=18}->毛里求斯 key唯一,value替換
}
1.8 LinkedHashMap
java.util.LinkedHashMap<K,V> extends HashMap<K,V>
底層原理: 哈希表+鏈表(記錄元素的順序)
LinkedHashMap<String,String> linked = new LinkedHashMap<>();
linked.put("a","a");
linked.put("c","c");
linked.put("b","b");
linked.put("d","d");
System.out.println(linked); //key不允許重複,有序{a=a, c=c, b=b, d=d}