[Java基础]Map集合的遍历
Map集合是Java中非常常用的一個(gè)集合,通過(guò)Map集合可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的快速檢索和插入刪除等操作;同樣對(duì)Map集合的遍歷也是十分重要的;如果你之前學(xué)過(guò)C++,那么對(duì)于Map的遍歷操作可就不能像是C++那樣通過(guò)下標(biāo)遍歷了;
這里我提供兩種遍歷Map集合的方式,以及性能和使用方式的比較;
通過(guò)key獲取value
這種方式是先獲取Map的key值,再通過(guò) Map 的 get() 方法 獲取對(duì)應(yīng)的value值;
代碼如下:
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class MapTraverse01 {public static void main(String[] args) {Map<Integer, String> map = new HashMap<>(); // 創(chuàng)建一個(gè)HashMap對(duì)象// 存入mapmap.put(1, "張三");map.put(2, "李四");map.put(3, "王五");map.put(4, "趙六");map.put(5, "小三");// 迭代器遍歷Set<Integer> set = map.keySet(); // 獲取key對(duì)應(yīng)的Set集合Iterator<Integer> iterator = set.iterator(); // 通過(guò)迭代器遍歷while (iterator.hasNext()) {Integer i = iterator.next();// 輸出key并通過(guò)key輸出valueSystem.out.println("key:" + i + " value:" + map.get(i));}System.out.println("=================");// foreach循環(huán)for (Integer i : map.keySet()) {System.out.println("key:" + i + " value:" + map.get(i));}System.out.println("=================");} }輸出如下:
key:1 value:張三 key:2 value:李四 key:3 value:王五 key:4 value:趙六 key:5 value:小三 ================= key:1 value:張三 key:2 value:李四 key:3 value:王五 key:4 value:趙六 key:5 value:小三 =================這里我用了迭代器和foreach循環(huán),至于它們的區(qū)別我會(huì)在文章最后詳細(xì)介紹;
接下來(lái)分析一下這種方法的效率;
我們通過(guò) keySet() 方法獲取到了所有的key值,并沒(méi)有獲取到value值,這意味著每次遍歷時(shí)通過(guò) get() 方法得到value值時(shí)都需要再次遍歷Map集合,就相當(dāng)于遍歷了兩次,第一次是對(duì)key的Set集合遍歷,第二次是通過(guò)map.get(key)來(lái)獲取value值;
一旦數(shù)據(jù)量大的時(shí)候,這種遍歷方式的效率就會(huì)明顯降低;
當(dāng)然,如果數(shù)據(jù)量較小時(shí)還是比較推薦這種方法的;
同時(shí)獲取key和Value
這種方法是同時(shí)獲取到 key 和 value 值,這里就不再使用 keySet() 方法了,而是使用 entrySet() 獲取Map中的key-value對(duì);
這里還是簡(jiǎn)單介紹一下Map.Entry<K,V>接口;
英語(yǔ)好的可以結(jié)合理解一下對(duì)Map.Entry<K,V>接口的介紹:
A map entry (key-value pair). The Map.entrySet method returns a collection-view of the map, whose elements are of this class. The only way to obtain a reference to a map entry is from the iterator of this collection-view. These Map.Entry objects are valid only for the duration of the iteration; more formally, the behavior of a map entry is undefined if the backing map has been modified after the entry was returned by the iterator, except through the setValue operation on the map entry.
其中這里我們只需要記住兩種方法:
就是分別獲取到key值和value值;
下面我將用代碼示范一下第二種遍歷方式:
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class MapTraverse02 {public static void main(String[] args) {Map<Integer, String> map = new HashMap<>(); // 創(chuàng)建一個(gè)HashMap對(duì)象// 存入mapmap.put(1, "張三");map.put(2, "李四");map.put(3, "王五");map.put(4, "趙六");map.put(5, "小三");// 迭代器Set<Map.Entry<Integer, String>> set = map.entrySet(); // 獲取map中的key-value對(duì)Iterator<Map.Entry<Integer, String>> iterator = set.iterator();while (iterator.hasNext()) {Map.Entry<Integer, String> i = iterator.next();// 這里必須定義局部變量,如果直接用迭代器獲取key后迭代器就會(huì)前移,輸出下一個(gè)value時(shí)就會(huì)到達(dá)下一個(gè)迭代的位置// System.out.println("key:" + iterator2.next().getKey() + " value:" + iterator2.next().getValue());// 上面這樣不可以// 通過(guò)Entry內(nèi)部類(lèi)獲取key和valueSystem.out.println("key:" + i.getKey() + " value:" + i.getValue());}System.out.println("=================");// foreach循環(huán)for (Map.Entry<Integer, String> i : map.entrySet()) {System.out.println("key:" + i.getKey() + " value:" + i.getValue());}System.out.println("=================");} }輸出如下:
key:1 value:張三 key:2 value:李四 key:3 value:王五 key:4 value:趙六 key:5 value:小三 ================= key:1 value:張三 key:2 value:李四 key:3 value:王五 key:4 value:趙六 key:5 value:小三 =================這種遍歷方式在數(shù)據(jù)量大的時(shí)候比第一種方式效率更高,因?yàn)槭峭瑫r(shí)獲取的key和value值,所以還是要根據(jù)實(shí)際情況對(duì)這兩種遍歷方法進(jìn)行選擇;
可能開(kāi)始接觸Map.Entry會(huì)有不適應(yīng),多用用就好了,以后可能會(huì)考慮為Map.Entry專(zhuān)門(mén)寫(xiě)一篇博客,在這里留個(gè)位;
迭代器遍歷和foreach遍歷的區(qū)別
這里簡(jiǎn)單說(shuō)一下這兩種遍歷方式的區(qū)別;
迭代器遍歷的效率會(huì)比f(wàn)oreach循環(huán)遍歷的效率高一點(diǎn),但是它們的主要區(qū)別并不在這里;
只需要記住一點(diǎn):
如果用foreach循環(huán)體,那么對(duì)集合元素進(jìn)行增刪改操作的時(shí)候,
就會(huì)出現(xiàn)異常ConcurrentModificationException;
所以foreach僅僅用來(lái)遍歷輸出還是方便的,但是不要用來(lái)修改集合的數(shù)據(jù);
如果需要對(duì)集合進(jìn)行增刪改操作,那么就使用迭代器遍歷,可以使用 iterator 的 remove()方法;
這里就不做示范了,感興趣可以自己嘗試;
歡迎大家的點(diǎn)評(píng)!
總結(jié)
以上是生活随笔為你收集整理的[Java基础]Map集合的遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设计模式(二)————观察者模式
- 下一篇: [Java基础] Properties类