簡(jiǎn)介:
- Map集合:將鍵映射到值的對(duì)象窄瘟。
(1)一個(gè)映射不能包含重復(fù)的鍵跷坝;
(2)每個(gè)鍵最多只能映射到一個(gè)值。 - Map集合存儲(chǔ)元素是成對(duì)出現(xiàn)的希坚,Map集合的鍵是唯一的,值是可重復(fù)的陵且。
- Map集合的數(shù)據(jù)結(jié)構(gòu)只針對(duì)鍵有效裁僧,跟值無(wú)關(guān) ,根據(jù)鍵的數(shù)據(jù)結(jié)構(gòu)分類Map集合常用類為:HashMap慕购,TreeMap
常用方法:
- 增加元素:V put(K key,V value):添加元素聊疲。
(1)如果鍵是第一次存儲(chǔ),就直接存儲(chǔ)元素沪悲,返回null
(2)如果鍵不是第一次存在获洲,就用值把以前的值替換掉,返回以前的值 - 刪除功能
(1)void clear():刪除所有的鍵值對(duì)元素
(2)V remove(Object key):根據(jù)鍵刪除鍵值對(duì)元素殿如,并把值返回贡珊; - 查詢:
(1)根據(jù)鍵來(lái)查詢:boolean containsKey(Object key):判斷集合是否包含指定的鍵
(2)根據(jù)值來(lái)查詢;boolean containsValue(Object value):判斷集合是否包含指定的值
(3)boolean isEmpty():判斷集合是否為空 - 獲取方法:
(1)V get(Object key):根據(jù)鍵獲取值
(2)Set<K> keySet():獲取集合中所有鍵的集合
(3)Collection<V> values():獲取集合中所有值的集合
(4)Set<Map.Entry<K,V>> entrySet():遍歷獲取
關(guān)于Entry的理解;
相信大家在剛接觸java的時(shí)候肯定對(duì)Map集合中Set<Map.Entry<K,V>> entrySet()方法很難理解,這里我說(shuō)下我的理解涉馁,歡迎大家指正:
(1)首先我們理解什么是內(nèi)部類门岔,內(nèi)部類簡(jiǎn)單來(lái)說(shuō)就是定義在一個(gè)類中的類,內(nèi)部類的特點(diǎn)是就是能夠訪問(wèn)外部類的任何屬性和方法烤送;內(nèi)部類的調(diào)用方法是"外部類.內(nèi)部類"寒随;
(2)這里正是應(yīng)用了這個(gè)方法:在Map接口內(nèi)部定義了一個(gè)子接口,該字接口也可以理解為是Map類型的,這個(gè)子接口內(nèi)部提供了獲取Map集合中的key和value的方法妻往;
(3)通過(guò)調(diào)用entrySet方法獲取一個(gè)Set集合互艾,該集合中存放的元素為Map.Entry類型的元素。
(4)API對(duì)這個(gè)內(nèi)部接口定義大概意思是蒲讯,他存儲(chǔ)了與對(duì)應(yīng)的Map集合相同的元素映射忘朝。也就是說(shuō)同過(guò)entrySet方法得到的是將Map集合元素以Map.Entry類型存放在了一個(gè)set集合中。
(5)遍歷Map.Entry我們只能通過(guò)高級(jí)for循環(huán)來(lái)遍歷了判帮。
Map集合的兩種遍歷方法;
public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
//遍歷方式1:keySet
Set<Integer> key_Set = map.keySet();
for(Iterator<Integer> it = key_Set.iterator();it.hasNext();){
int key = it.next();
System.out.println("key :" + key +"; "+ "value : " + map.get(key));
}
//遍歷方式2:entrySet
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
for(Map.Entry<Integer, String> temp : entrySet){
System.out.println("key :" + temp.getKey() +"; "+ "value : " + temp.getValue());
}
}
}
注意Map集合沒(méi)有迭代器方法局嘁,所以有了兩個(gè)方法keySet()/entrySet();各返回一個(gè)Set集合晦墙,在通過(guò)遍歷Set集合的方法來(lái)遍歷Map中的內(nèi)容悦昵;
方法1中:先通過(guò)將Map中的key存放在Set中,在遍歷Set中的key的同時(shí)在調(diào)用Map的get方法獲取值晌畅,這個(gè)方法略顯得有點(diǎn)效率低下但指;
方法2中:先通過(guò)將Map中的Entry放在Set中,在通過(guò)遍歷Set中的Map.Entry對(duì)象來(lái)獲取Map中的鍵和值抗楔。這個(gè)方法是被推薦是使用的棋凳;但是這里有個(gè)誤區(qū)千萬(wàn)不能在第二方法的時(shí)候同過(guò)迭代器來(lái)迭代Set集合!原因是獲取it.next()值要不獲取值要不獲取鍵连躏。如果一個(gè)循環(huán)內(nèi)調(diào)用兩次next獲取鍵和值剩岳,那么就會(huì)產(chǎn)生錯(cuò)誤;