一. Map集合(Map是一個(gè)接口)
1.定義
????詞義:映射,理解為對(duì)應(yīng)。
????Map每次操作的元素是成對(duì)的。兩個(gè):key(鍵),value(值)。(存儲(chǔ)無(wú)序)
????Map中存儲(chǔ)的元素,鍵值對(duì)。其中鍵不能重復(fù)。值可以重復(fù)。鍵和值,必須是一一對(duì)應(yīng)的。
????Map集合是一個(gè)雙列集合,以鍵值對(duì)的形式存在
????將鍵和值捆綁到一起存放(Map.Entry)
????一個(gè)映射不能包含重復(fù)的鍵
????如果出現(xiàn)相同的鍵,會(huì)用新的值覆蓋老的值
????每個(gè)鍵最多只能映射到一個(gè)值
2.Map接口和Collection接口的不同
????Map是雙列的,Collection是單列的
????Map集合的數(shù)據(jù)結(jié)構(gòu)針對(duì)鍵有效, 跟值無(wú)關(guān), Collection 集合的數(shù)據(jù)結(jié)構(gòu)是針對(duì)元素有效
3.常用功能
????添加方法:
????????V put(K key , V value): 添加元素
????????????如果鍵是第一次存儲(chǔ), 直接存儲(chǔ)元素,返回null
????????????如果鍵不是第一個(gè)存在, 就用值把以前的值替換掉,返回以前的值
????刪除方法:
????????void clear() : 移除所有的鍵值對(duì)元素
? ? ? ? V remove(Object key) : 根據(jù)鍵刪除鍵值對(duì)元素, 并把值返回
????判斷方法:
????????boolean containsKey(Object key) :? 判斷集合是否包含指定的鍵
????????boolean containsValue(Object value): 判斷集合是否包含指定的值
????????boolean isEmpty: 判斷集合是否為空
????獲取方法:
????????Set<Map.Entry<K,V>> entrySet() : 獲取所有的鍵值對(duì)
????????Map.Entry
????????????Entry可以認(rèn)為是一個(gè)鍵值對(duì)對(duì)象。理解為:將鍵值對(duì)看成一個(gè)整體的對(duì)象。
????????????包含了Key,Value。
????????????Map中操作的是一對(duì)對(duì)象。key和value。存在一個(gè)映射關(guān)系。對(duì)應(yīng)的。
????????V get(Object key) : 根據(jù)鍵獲取值
????????Set<K> keySet() : 獲取集合中所有鍵的集合
????????Collection<V> values() :? 獲取集合中所有值的集合
????????int size() : 返回集合中鍵值對(duì)的個(gè)數(shù)
4.演示


二. Map集合的遍歷
對(duì)于map集合,無(wú)法直接迭代獲取里面的元素。(map是沒有迭代器)
1.獲取所有鍵的集合的遍歷
????通過keySet方法獲取到所有鍵的Set集合
????演示

2.獲取所有的值的遍歷
????通過values方法獲取所有值的Collection集合
????演示

3.獲取所有鍵值對(duì)的遍歷
????通過entrySet集合獲取所有的鍵值對(duì)的Set集合
????演示

三. HashMap
1.定義
????底層使用的是數(shù)組
????HashMap就是通過我們存入的key獲取到一個(gè)hash值, 經(jīng)過計(jì)算之后, 獲取到一個(gè)數(shù)組角標(biāo), 然后將key和value封裝到一個(gè)Entry里面, 然后存入數(shù)組
????當(dāng)數(shù)組容量不夠的時(shí)候, 會(huì)自動(dòng)擴(kuò)容一倍
2.構(gòu)造方法
????HashMap()
????????構(gòu)造一個(gè)具有默認(rèn)初始容量(16) 和默認(rèn)加載因子(0.75)的空HashMap
????HashMap(int initialCapacity)
????????構(gòu)造一個(gè)帶指定初始容量和默認(rèn)加載因子 (0.75) 的空HashMap
????HashMap(int initialCapacity, float loadFactor)
????????構(gòu)造一個(gè)帶指定初始容量和加載因子的空HashMap
????HashMap(Map<? extends K, ?extends V> m)
????????構(gòu)造一個(gè)映射關(guān)系與制定Map相同的新HashMap
3.常用方法
????put(K key, V value) : 在此映射中關(guān)聯(lián)指定值與指定鍵
????putAll(Map<? extends K, ?extends V> m) : 將另外一個(gè)map集合復(fù)制到此集合中
4.案例
????HashMap集合鍵是Student 值是String 的案例
????注意
????????如果我們需要將對(duì)象中的內(nèi)容當(dāng)作比較依據(jù)的話, 就必須要重寫hashCode和equals方法
????演示

5.測(cè)試題
????需求: 從鍵盤錄入一串字符, 統(tǒng)計(jì)字符串中每個(gè)字符出現(xiàn)的次數(shù)
????演示

6.對(duì)比HashSet和HashMap
????1、都要求同時(shí)重寫hashCode()和equals()
????2、不保證順序
??????? HashSet不關(guān)心存儲(chǔ)的元素的順序。添加的順序和迭代的順序不一定一致。
??????? HashMap不關(guān)心key的順序。
補(bǔ)充一句話:HashSet的底層就是HashMap,只不過只要key,不要value值。
四. HashMap和HashTable的區(qū)別
1.哈希表:HashTable舊的類。
筆試題:?jiǎn)朒ashMap和HashTable的區(qū)別?
HashMap和HashTable都是Map的實(shí)現(xiàn)類
父類不一樣:繼承結(jié)構(gòu)不同。
HashTable的父類是:Dictionary
HashMap的父類是:AbstractMap
HashMap是HashTable的替代品。HashTable是舊的類,線程安全,效率低。
對(duì)于null的處理
HashMap對(duì)null,看成了普通的對(duì)象。可以key為null,也可以value為null
HashTable對(duì)null沒有進(jìn)行處理。拋出異常:NullPointerException
2.HashMap和Hashtable的區(qū)別
????HashTable是JDK1.0版本出現(xiàn)的,是線程安全的,效率低,HashMap是JDK1.2版本出現(xiàn)的,是線程不安全的,效率高
????HashTable不可以存儲(chǔ)null鍵和null值,HashMap可以存儲(chǔ)null鍵和null值
3.案例演示

五. TreeMap
1.定義
????TreeMap通過比較元素的大小,對(duì)元素進(jìn)行排序, 最后形成了一個(gè)樹狀結(jié)構(gòu)
????TreeMap中的key需要實(shí)現(xiàn)Comparable接口并重寫compareTo方法, 或者使用Comparator比較器
????存入元素的時(shí)候,如果會(huì)將新添加的元素的key和集合中已經(jīng)存在的元素的key比較,返回一個(gè)小于0的數(shù),說明,新添加的元素小于已有元素, 如果返回的是一個(gè)等于0的數(shù),說明新添加的元素等于已有元素, value覆蓋, 如果返回一個(gè)大于0的數(shù),說明新添加的元素大于已有元素
2.案例演示

3.HashMap和TreeMap的區(qū)別
????HashMap:
?????????key允許為空并且唯一;
? ? ? ? 添加和獲取的順序 都是無(wú)序的(內(nèi)存中存儲(chǔ)是無(wú)序的)
????TreeMap:
????????key不運(yùn)行為空并且唯一。
? ? ? ? 會(huì)根據(jù)key的值進(jìn)行排序(內(nèi)存中存儲(chǔ)是無(wú)序的)
? ? linkedHashMap:
? ? ? ? 有序的,指的是:添加元素進(jìn)去的順序,和取出來的順序是一樣的。
????????去重的原理和HashMap相同。
六. 案例(模擬洗牌和發(fā)牌)
1.演示


總結(jié)

Properties【了解】
1、Properties類從結(jié)構(gòu)來看,是HashTable的子類,也是集合中的一員。也是用于存儲(chǔ)數(shù)據(jù)的,都是一些配置信息。泛型<key,value>,String類型。
其他的集合存儲(chǔ)對(duì)象的,Properties存儲(chǔ)屬性信息。
2、超綱:
將屬性集合Properties中的數(shù)據(jù)——>file文件中
file文件中——>屬性集合Properties中
Collections工具類
1.Collection和Collections的區(qū)別?
????Collection:集合中最大的父接口,List和Set的父接口,規(guī)定了集合最基本的操作。
????Collections:集合的工具類,包含了集合的常用方法。
????Arrays:數(shù)組的工具類,包含了數(shù)組的常用方法。
2、返回線程安全的集合
static<T>List<T>synchronizedList(List<T>list)
返回由指定列表支持的同步(線程安全)列表。
static<T>Set<T>synchronizedSet(Set<T>s)
static<T>Collection<T>synchronizedCollection(Collection<T>c)
返回由指定集合支持的同步(線程安全)集合。
static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
返回由指定地圖支持的同步(線程安全)映射。
Collection<Object> c = Collections.synchronizedCollection(new ArrayList<>());
List<Object> list = Collections.synchronizedList(new ArrayList<>());
Map<Object, Object> map = Collections.synchronizedMap(new HashMap<>());
3、可以向Collection容器中,同時(shí)添加多個(gè)元素
Collections.addAll(容器,要添加的元素);
4、List排序
Collections.sort(list);
Collections.sort(list,Comparator)
5.將集合中的元素進(jìn)行翻轉(zhuǎn):
/*
static void reverse(List<?> list)
反轉(zhuǎn)指定列表中元素的順序。?
*/
//list集合的翻轉(zhuǎn):元素顛倒過來。
Collections.reverse(list2);
6.將集合中元素隨機(jī)
/*
隨機(jī)洗牌
static void shuffle(List<?> list)
使用默認(rèn)的隨機(jī)源隨機(jī)排列指定的列表
*/
? ? ? ? //讓集合中的元素,隨機(jī)的存儲(chǔ)位置
? ? ? ? Collections.shuffle(list2);
? ? ? ? System.out.println(list2);
7.替換
/*
static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
將列表中一個(gè)指定值的所有出現(xiàn)替換為另一個(gè)。
*/
Collections.replaceAll(list2, 1, 100);
System.out.println(list2);
8.統(tǒng)計(jì)指定元素在集合中出現(xiàn)的次數(shù)
/*
static int frequency(Collection<?> c, Object o)
返回指定集合中與指定對(duì)象相等的元素?cái)?shù)
*/
int count = Collections.frequency(list2, 6);
System.out.println(count);