Map接口不屬于Collection的繼承或?qū)崿F(xiàn)瞄摊,Map接口是維護(hù)鍵值對(duì)的,并且不能有重復(fù)的鍵苦掘,但是在Map的底層是用Set來(lái)存的换帜,所以在存入Map中的映射對(duì)的鍵對(duì)應(yīng)的類型必須重寫(xiě)equals跟hashcode方法,一般常用String類型作為Map的key鹤啡,Map接口的常用實(shí)現(xiàn)類有:HashMap惯驼,LinkedHashMap,TreeMap递瑰,Properties
1.1HashMap
HashMap是基于哈希表的Map接口實(shí)現(xiàn)的祟牲,因此它內(nèi)部的鍵是通過(guò)Set散列存放,所以根據(jù)鍵去查的效率非常高抖部,并且允許null鍵null值说贝,但是不保證映射順序,下面用代碼顯示:
public static void main(String[] args) {
HashMap hashMap=new HashMap();
? ? hashMap.put("1","張三");
? ? hashMap.put("2","李四");
? ? hashMap.put("6","王五");
? ? hashMap.put("4","趙六");
? ? hashMap.put("0","尼瑪");
??? hashMap.put("4","趙六");
? ? System.out.println("原始的元素"+hashMap);
? ? //得到全部鍵慎颗,內(nèi)部的鍵是跟Set存的乡恕,因此獲得的鍵是Set型
? ? Set set = hashMap.keySet();
? ? Iterator iterator=set.iterator();
? ? while (iterator.hasNext()){
System.out.println("通過(guò)所有的鍵來(lái)得到所有的值:"+hashMap.get(iterator.next()));
? ? }
}
結(jié)果顯示:
原始的元素{0=尼瑪, 1=張三, 2=李四, 4=趙六, 6=王五}???? //內(nèi)部有hash的算法順序
通過(guò)所有的鍵來(lái)得到所有的值:尼瑪
通過(guò)所有的鍵來(lái)得到所有的值:張三
通過(guò)所有的鍵來(lái)得到所有的值:李四
通過(guò)所有的鍵來(lái)得到所有的值:趙六
通過(guò)所有的鍵來(lái)得到所有的值:王五
注:結(jié)果是以大括號(hào)括住,鍵在左俯萎,值在右傲宜,無(wú)序不重復(fù)
Map集合中value()方法與keySet()、entrySet()區(qū)別
在Map集合中
values():方法是獲取集合中的所有的值----沒(méi)有鍵夫啊,沒(méi)有對(duì)應(yīng)關(guān)系函卒,
KeySet():
將Map中所有的鍵存入到set集合中。因?yàn)閟et具備迭代器撇眯。所有可以迭代方式取出所有的鍵报嵌,再根據(jù)get方法虱咧。獲取每一個(gè)鍵對(duì)應(yīng)的值。 keySet():迭代后只能通過(guò)get()取key?
entrySet():
Set<Map.Entry<K,V>>
entrySet() //返回此映射中包含的映射關(guān)系的 Set 視圖沪蓬。
Map.Entry表示映射關(guān)系彤钟。entrySet():迭代后可以e.getKey(),e.getValue()取key和value跷叉。返回的是Entry接口逸雹。
下面通過(guò)例子看看:
Map<String,String> map = new HashMap<String,String>();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
Collection<String> collection = map.values();//返回值是個(gè)值的Collection集合
System.out.println(collection);
打印結(jié)果:
[zhangsan, lisi, wangwu]
Set<K> keySet() //返回值是個(gè)只存放key值的Set集合(集合中無(wú)序存放的)
Set<Map.Entry<K,V>> entrySet() //返回映射所包含的映射關(guān)系的Set集合(一個(gè)關(guān)系就是一個(gè)鍵-值對(duì)),就是把(key-value)作為一個(gè)整體一對(duì)一對(duì)地存放到Set集合當(dāng)中的云挟。
一. keySet()方式梆砸。
Map<String,String> map = new HashMap<String,String>();
? ? ? ? map.put("01", "zhangsan");
? ? ? ? map.put("02", "lisi");
? ? ? ? map.put("03", "wangwu");
? ? ? ? Set<String> keySet = map.keySet();//先獲取map集合的所有鍵的Set集合
? ? ? ? Iterator<String> it = keySet.iterator();//有了Set集合,就可以獲取其迭代器园欣。
? ? ? ? while(it.hasNext()){
? ? ? ? ? ? ? ? String key = it.next();
? ? ? ? ? ? ? ? String value = map.get(key);//有了鍵可以通過(guò)map集合的get方法獲取其對(duì)應(yīng)的值帖世。
? ? ? ? ? ? ? ? System.out.println("key: "+key+"-->value: "+value);//獲得key和value值
? ? ? ? ? ? ? ? }
二. entrySet()方式:
Map map = new HashMap();
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
//通過(guò)entrySet()方法將map集合中的映射關(guān)系取出(這個(gè)關(guān)系就是Map.Entry類型)
Set> entrySet = map.entrySet();
//將關(guān)系集合entrySet進(jìn)行迭代,存放到迭代器中
Iterator> it2 = entrySet.iterator();
while(it2.hasNext()){
? ? ? ? Map.Entry<String, String> me = it2.next();//獲取Map.Entry關(guān)系對(duì)象me
? ? ? ? String key2 = me.getKey();//通過(guò)關(guān)系對(duì)象獲取key
? ? ? ? String value2 = me.getValue();//通過(guò)關(guān)系對(duì)象獲取value
? ? ? ? System.out.println("key: "+key2+"-->value: "+value2);
}
雖然使用keyset及entryset來(lái)進(jìn)行遍歷能取得相同的結(jié)果
但兩者的遍歷速度是有差別的
keySet():迭代后只能通過(guò)get()取key?
entrySet():迭代后可以e.getKey()沸枯,e.getValue()取key和value日矫。返回的是Entry接口?
說(shuō)明:keySet()的速度比entrySet()慢了很多,也就是keySet方式遍歷Map的性能不如entrySet性能好
為了提高性能绑榴,以后多考慮用entrySet()方式來(lái)進(jìn)行遍歷哪轿。