Map 集合和 Collection 集合不同惩嘉,Map 集合是基于鍵(key)/值(value)的映射罢洲,Collection中的集合,元素是孤立存在的文黎,向集合中存儲元素采用一個(gè)個(gè)元素的方式存儲惹苗;Map中的集合,元素是成對存在的耸峭,每個(gè)元素由鍵與值兩部分組成桩蓉,通過鍵可以找對所對應(yīng)的值。Collection中的集合稱為單列集合劳闹,Map中的集合稱為雙列集合院究。需要注意的是洽瞬,Map中的集合不能包含重復(fù)的鍵,值可以重復(fù)业汰;每個(gè)鍵只能對應(yīng)一個(gè)值伙窃。
1、Map 集合特點(diǎn)
每個(gè)元素成對存在样漆,由鍵和值兩部分組成为障,通過鍵可以找到對應(yīng)的值
鍵(key值)不可重復(fù),值(value)可以重復(fù)放祟,一個(gè)value值可以和很多key值形成對應(yīng)關(guān)系鳍怨,每個(gè)建最多只能映射到一個(gè)值
兩個(gè) Map 接口的重要實(shí)現(xiàn)類:HashMap 類、LinkedHashMap 類
2跪妥、Map接口中的常用方法
get(Object key):獲取指定鍵(key)所對應(yīng)的值(value)
put(K key鞋喇,V value):將指定的鍵與值對應(yīng)起來,并添加到集合中
若指定的鍵(key)在集合中沒有骗奖,則沒有這個(gè)鍵對應(yīng)的值确徙,返回null,并把指定的鍵值添加到集合中
若指定的鍵(key)在集合中存在执桌,則返回值為集合中鍵對應(yīng)的值(該值為替換前的值)鄙皇,并把指定鍵所對應(yīng)的值,替換成指定的新值
remove(Object key):根據(jù)指定的鍵(key)刪除元素仰挣,返回被刪除元素的值(value)
public static void main(String[] args)
{
? ? //創(chuàng)建Map對象
? ? Map<String,String> M = new HashMap<>();
? ? //添加元素
? ? M.put("湯姆","Tom");
? ? M.put("提姆","Tim");
? ? M.put("瑞克","Rik");
? ? System.out.println(M);
? ? //根據(jù)指定的key獲取對應(yīng)的value
? ? System.out.println(M.get("湯姆"));
? ? //根據(jù)key刪除元素,會返回key對應(yīng)的value值
? ? String val = M.remove("提姆");
? ? System.out.println(val);
? ? System.out.println(M);
? ? //當(dāng)給Map中添加元素伴逸,會返回key對應(yīng)的原來的value值,若key沒有對應(yīng)的值,返回null
? ? System.out.println(M.put("湯姆","TTT"));? //Tom
? ? System.out.println(M);
}
3膘壶、Map 集合遍歷方式 keySet 方法
Map 集合中遍歷是通過鍵找值的方法來實(shí)現(xiàn)的错蝴,即:通過元素中的鍵,獲取鍵所對應(yīng)的值颓芭,步驟如下:
調(diào)用 Map 集合的方法 keySet顷锰,將所有的鍵(key值)存儲到Set集合中
遍歷 Set 集合,獲取出 Set 集合中的所有元素 ( Map 中的鍵(key值))
調(diào)用 Map 集合 get 方法亡问,通過鍵(key值)獲取到值(value值)
public static void main(String[] args)
{
? ? //創(chuàng)建Map集合并添加元素
? ? Map<Integer,String> M = new HashMap<>();
? ? M.put(1,"a");
? ? M.put(2,"b");
? ? M.put(3,"c");
? ? //1. 調(diào)用 Map 集合的方法 keySet官紫,將所有的鍵(key值)存儲到Set集合中
? ? Set<Integer> S = M.keySet();
? ? //2.遍歷 Set 集合,獲取出 Set 集合中的所有元素 ( Map 中的鍵(key值))
? ? Iterator<Integer> it = S.iterator();
? ? while (it.hasNext())
? ? {
? ? ? ? //獲取Map中的鍵
? ? ? ? Integer key = it.next();
? ? ? ? //3.調(diào)用 Map 集合 get 方法州藕,通過鍵(key值)獲取到值(value值)
? ? ? ? String value = M.get(key);
? ? ? ? System.out.println(key + "=" + value);
? ? }
}
當(dāng)然束世,也可以使用增強(qiáng)for
for(String key : map.keySet())
{
? ? Integer value = map.get(key);
? ? System.out.println(key+"="+value);
}
4、Map 集合 Entry 對象使用 entrySet 方法遍歷
在 Map 類設(shè)計(jì)時(shí)床玻,提供了一個(gè)嵌套接口:Entry毁涉。Entry將鍵值對的對應(yīng)關(guān)系封裝成了對象,即鍵值對對象锈死,這樣我們在遍歷 Map 集合時(shí)贫堰,就可以從每一個(gè)鍵值對(Entry)對象中獲取對應(yīng)的鍵與對應(yīng)的值穆壕。
Entry是Map的一個(gè)內(nèi)部接口,由Map的子類的內(nèi)部類實(shí)現(xiàn)严嗜,可以使用 Map 接口中的 entrySet 方法返回一個(gè) Entry 對象
interface Map{
? ? interface Entry{? ? ?
? ? }
}
Entry 對象特點(diǎn):
Entry是Map接口中提供的一個(gè)靜態(tài)內(nèi)部嵌套接口
相關(guān)方法
???? getKey()方法:獲取Entry對象中的鍵
???? getValue()方法:獲取Entry對象中的值
???? entrySet()方法:用于返回Map集合中所有的鍵值對(Entry)對象粱檀,以Set集合形式返回
Map 集合遍歷方式 entrySet 方法:
調(diào)用 Map 集合方法 entrySet() 將集合中的映射關(guān)系對象 Entrty 存儲到Set集合:Set<Entry <K,V> >
迭代 Set 集合
獲取出的 Set 集合的元素,是映射關(guān)系對象
通過映射關(guān)系對象方法 getKet, getValue 獲取鍵值對
public static void main(String[] args)
{
? ? //創(chuàng)建Map集合并存儲元素
? ? Map<Integer,String> M = new HashMap<>();
? ? M.put(1,"a");
? ? M.put(2,"b");
? ? M.put(3,"c");
? ? //1.調(diào)用 Map 集合方法 entrySet() 將集合中的映射關(guān)系對象 Entrty 存儲到Set集合:Set<Entry <K,V> >
? ? Set<Map.Entry<Integer,String>> S = M.entrySet();
? ? //2.迭代 Set 集合
? ? Iterator<Map.Entry<Integer,String>> it = S.iterator();
? ? while (it.hasNext())
? ? {
? ? ? ? //3.獲取出的 Set 集合的元素的映射關(guān)系對象
? ? ? ? Map.Entry<Integer,String> entry = it.next();
? ? ? ? //4.通過映射關(guān)系對象方法 getKet, getValue 獲取鍵值對
? ? ? ? Integer key = entry.getKey();
? ? ? ? String value = entry.getValue();
? ? ? ? System.out.println(key + "=" + value);
? ? }
}
5漫玄、HashMap 集合存儲自定義對象和遍歷
使用HashMap集合,存儲自定義的對象,這個(gè)自定義對象既可以作為鍵压彭,也可以作為值(注意要保證鍵的唯一性)
代碼實(shí)例(這里省略了Person類)
public static void main(String[] args)
{
? ? //創(chuàng)建Map集合用來存儲創(chuàng)建的對象
? ? Map<Integer,Person> M = new HashMap<>();
? ? M.put(1,new Person("Tom",18));
? ? M.put(2,new Person("Tim",19));
? ? M.put(3,new Person("Rik",20));
? ? //這里使用增強(qiáng)for進(jìn)行遍歷
? ? //1.使用keySet鍵找值方式遍歷
? ? for(Integer key : M.keySet())
? ? {
? ? ? ? Person value = M.get(key);
? ? ? ? System.out.println(key + "=" + value);
? ? }
? ? //2.使用entrySet 鍵值對方式遍歷
? ? for(Map.Entry<Integer,Person> entry : M.entrySet())
? ? {
? ? ? ? Integer key = entry.getKey();
? ? ? ? Person value = entry.getValue();
? ? ? ? System.out.println(key + "=" + value);
? ? }
}
當(dāng)給 HashMap 中存放自定義的對象時(shí)睦优,如果自定義對象作為鍵(key)存在,這時(shí)要保證對象唯一性壮不,必須將對象的 hashCode 和 equals 方法重寫
如果要保證 Map 中存放的 key 和取出的順序一致汗盘,可以使用 LinkedHashMap 集合來存儲
6、LinkedHashMap 的特點(diǎn)
LinkedHashMap繼承HashMap询一,能夠保證迭代的順序
public static void main(String[] args) {
LinkedHashMap<String, String> link = new LinkedHashMap<String, String>();
link.put("1", "a");
link.put("13", "a");
link.put("15", "a");
link.put("17", "a");
System.out.println(link);
}
7隐孽、Hashtable 的特點(diǎn)
是 Map 接口實(shí)現(xiàn)類
底層數(shù)據(jù)結(jié)果哈希表,特點(diǎn)和 HashMap 是一樣的
Hashtable 是線程安全集合,運(yùn)行速度慢(HashMap 線程不安全健蕊,運(yùn)行速度快)
Hashtable 命運(yùn)和Vector是一樣的,從JDK1.2開始菱阵,被更先進(jìn)的 HashMap 取代
Hashtable 不允許存儲 null 值,null 鍵(HashMap 允許存儲 null 值缩功,null 鍵)
Hashtable的子類 Properties 比較常用