JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類
版權聲明:轉載必須注明本文轉自程式員杜鵬程的部落格:http://blog.csdn.net/m366917
今天一覺醒來,朋友圈都是慶祝女排12後再次獲得奧運冠軍,有種精神叫做女排精神,學習女排,振興中華。我們先讓自己強大起來,整個祖國都會變的很強大
我們來繼續學習集合的最後一個知識點,Map集合
Map集合
- 概述
- 将鍵映射到值的對象
- 一個映射不能包含重複的鍵
- 每個鍵最多隻能映射到一個值
前面我們一直在學Collection集合,那麼它和Map集合有什麼差別呢?
- Map集合存儲元素是成對出現的,Map集合的鍵是唯一的,值是可重複的。可以把這個了解為:夫妻對
- Collection集合存儲元素是單獨出現的,Collection的兒子Set是唯一的,List是可重複的。可以把這個了解為:光棍
- 注意:
- Map集合的資料結構值針對鍵有效,跟值無關
- Collection集合的資料結構是針對元素有效
下面我們來了解Map集合的功能概述
- 添加功能
- V put(K key,V value):添加元素。
public class MapDemo {
public static void main(String[] args) {
// 建立集合對象
Map<String, String> map = new HashMap<String, String>();
System.out.println("put:" + map.put("馬蓉", "王寶強"));
System.out.println("put:" + map.put("馬蓉", "宋喆"));
// 輸出集合名稱
System.out.println("map:" + map);
}
}
我們來看輸出結果:第一次為什麼是null呢?而第二次傳回的是王寶強呢?最後奇怪的是馬蓉和宋喆真像現實中一樣。我來給大家說說這是為什麼?
因為如果鍵是第一次存儲,就直接存儲元素,傳回null
如果鍵不是第一次存在,就用值把以前的值替換掉,傳回以前的值
現在明白了吧。
但是我們平時添加元素不是這樣添加的,是下面這樣
// 建立集合對象
Map<String, String> map = new HashMap<String, String>();
// 添加元素
map.put("鄧超", "孫俪");
map.put("黃曉明", "楊穎");
map.put("周傑倫", "昆淩");
map.put("劉恺威", "楊幂");
// 輸出集合名稱
System.out.println("map:" + map);
輸出結果:map:{鄧超=孫俪, 周傑倫=昆淩, 黃曉明=楊穎, 劉恺威=楊幂}
我們繼續
- 删除功能
- void clear():移除所有的鍵值對元素
- V remove(Object key):根據鍵删除鍵值對元素,并把值傳回
我們在上面添加元素的基礎上來學習這個删除功能
map.clear();//會移除所有的鍵值對元素
System.out.println("map:" + map);//map:{} //是以不建議使用
//V remove(Object key):根據鍵删除鍵值對元素,并把值傳回
System.out.println("remove:" + map.remove("黃曉明"));
System.out.println("remove:" + map.remove("黃曉波"));
// 輸出集合名稱
System.out.println("map:" + map);
根據鍵删除對于值的元素輸出結果我們發現當這個鍵存在的時候,删除會傳回對應的值,
不存在的時候,删除會傳回null
- 判斷功能
- boolean containsKey(Object key):判斷集合是否包含指定的鍵
- boolean containsValue(Object value):判斷集合是否包含指定的值
- boolean isEmpty():判斷集合是否為空
//boolean containsKey(Object key):判斷集合是否包含指定的鍵
System.out.println("containsKey:" + map.containsKey("黃曉明"));
System.out.println("containsKey:" + map.containsKey("黃曉波"));
// 輸出集合名稱
System.out.println("map:" + map);
//boolean isEmpty():判斷集合是否為空
System.out.println("isEmpty:"+map.isEmpty());
這個就比較簡單了,判斷集合是否包含指定的值,我就不說了,和鍵一樣,給大家看一下輸出結果 我們看到判斷并不會影響他的輸出結果
- 長度功能
- int size():傳回集合中的鍵值對的對數
//這個也比較簡單了
System.out.println("size:"+map.size());//size:4
下面我們重點看一下Map的擷取功能
- 擷取功能
- V get(Object key):根據鍵擷取值
- Set keySet():擷取集合中所有鍵的集合
- Collection values():擷取集合中所有值的集合
- Set< Map.Entry< K,V>> entrySet():傳回的是鍵值對對象的集合
public class MapDemo {
public static void main(String[] args) {
// 建立集合對象
Map<String, String> map = new HashMap<String, String>();
// 建立元素并添加元素
map.put("鄧超", "孫俪");
map.put("黃曉明", "楊穎");
map.put("周傑倫", "蔡依林");
map.put("劉恺威", "楊幂");
// V get(Object key):根據鍵擷取值
System.out.println("get:" + map.get("周傑倫"));
System.out.println("get:" + map.get("周傑")); // 傳回null
// Set<K> keySet():擷取集合中所有鍵的集合
Set<String> set = map.keySet();
for (String key : set) {
System.out.println("key:"+key);
}
// Collection<V> values():擷取集合中所有值的集合
Collection<String> con = map.values();
for (String value : con) {
System.out.println("value:"+value);
}
// 擷取所有鍵值對對象的集合
Set<Map.Entry<String, String>> set1 = map.entrySet();
// 周遊鍵值對對象的集合,得到每一個鍵值對對象
for (Map.Entry<String, String> me : set1) {
// 根據鍵值對對象擷取鍵和值
String key = me.getKey();
String value = me.getValue();
System.out.println(key + "---" + value);
}
}
}
這個還是很好了解的,最重要的就是周遊得到每一個鍵值對對象,看下輸出結果
下面我們來看
Map子類
HashMap
- HashMap類概述
- 鍵是哈希表結構,可以保證鍵的唯一性
- 常用案例
- HashMap< String,String>
- HashMap< Integer,String>
- HashMap< String,Student>
- HashMap< Student,String>
- 上面的也不是非要是學生對象,可以是你需求的對象
LinkedHashMap
- 概述
- Map 接口的哈希表和連結清單實作,具有可預知的疊代順序。
- 由哈希表保證鍵的唯一性,不可重複
- 由連結清單保證鍵盤的有序(存儲和取出的順序一緻)
TreeMap
- 概述
- 鍵是紅黑樹結構,可以保證鍵的排序和唯一性
Map集合的知識點和它的子類我上面都将到了,下面我們來做道練習題吧
- HashMap和Hashtable的差別?
public class HashtableDemo {
public static void main(String[] args) {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("android", "hello");
hm.put(null, "world");
hm.put("java", null);
System.out.println(hm);
Hashtable<String, String> ht = new Hashtable<String, String>();
ht.put("android", "hello");
ht.put(null, "world"); //NullPointerException
ht.put("java", null); // NullPointerException
System.out.println(ht);
}
}
在輸出結果中:HashMap會列印出{null=world, java=null, android=hello}
而在Hashtable中會報錯
是以我們就能得出他們的差別
- HashMap:線程不安全,效率高。允許null鍵和null值
- Hashtable:線程安全,效率低。不允許null鍵和null值
我們再來學習一個知識點
Collections類
我們之前學習了Collection,那麼它和Collections有什麼差別呢。
我們先來了解Collections類,然後在來說他們之間的差別
- Collections類概述
- 針對集合進行操作的工具類,都是靜态方法。
- Collection和Collections的差別
- Collection:是單列集合的頂層接口,有子接口List和Set。
- Collections:是針對集合操作的工具類,有對集合進行排序和二分查找的方法
- Collections成員方法
- public static < T> void sort(List list):排序 預設情況下是自然順序。
- public static < T> int binarySearch(List< ?> list,T key):二分查找
- public static < T> T max(Collection< ?> coll):最大值
- public static void reverse(List< ?> list):反轉
- public static void shuffle(List< ?> list):随機置換
我們來練習一下
public class CollectionsDemo {
public static void main(String[] args) {
// 建立集合對象
List<Integer> list = new ArrayList<Integer>();
// 添加元素
list.add();
list.add();
list.add();
list.add();
list.add();
System.out.println("list:" + list);
// public static <T> void sort(List<T> list):排序 預設情況下是自然順序。
Collections.sort(list);
System.out.println("自然順序list:" + list);
// public static <T> int binarySearch(List<?> list,T key):二分查找
System.out.println("二分查找:" + Collections.binarySearch(list, ));
System.out.println("二分查找:"+ Collections.binarySearch(list, ));
// public static <T> T max(Collection<?> coll):最大值
System.out.println("max:"+Collections.max(list));
// public static void reverse(List<?> list):反轉
Collections.reverse(list);
System.out.println("list:" + list);
//public static void shuffle(List<?> list):随機置換
Collections.shuffle(list);
System.out.println("list:" + list);
}
}
我們來看下輸出結果:看到結果是不是二分查找不存在的時候傳回-6為什麼呢。
因為當二分查找不存在的時候,它就會傳回最大索引+1再+1.
上面的排序功能,它在預設情況下是自然順序,如果我們要存儲一個自定義對象,那麼他就不說自然排序了,就要用到我們上一篇講到的比較器Comparator排序了,大家要注意一下
好了,到這裡,我們就把集合基本上學完了。下一篇,我們就要開始IO流的學習了,你準備好了嗎?
歡迎有興趣的同學加我朋友的QQ群:點選直接加群555974449 請備注:java基礎再回首我們一起來玩吧。