map遍歷的幾種方式和效率問題


一、map遍歷的效率

先創建一個map,添加好數據:

Map<String, String> map = new HashMap<>();
for (int i = 0; i < 1000000; i++) {
map.put(i + "", i + "AA");
}

1、keySet的for循環方式:

//只獲取key
public static void keySetForGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (String key : map.keySet()) {
}
long endTime = System.currentTimeMillis();
System.out.println("keySetForGetKey運行時間" + (endTime - startTime));
}
//獲取key和value
public static void keySetForGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (String key : map.keySet()) {
String value = map.get(key);
}
long endTime = System.currentTimeMillis();
System.out.println("keySetForGetKeyAndValue運行時間" + (endTime - startTime));
}

2、keySet的iterator迭代器方式:

//只獲取key
public static void keySetIteratorGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
}
long endTime = System.currentTimeMillis();
System.out.println("keySetIteratorGetKey運行時間" + (endTime - startTime));
}
//獲取key和value
public static void keySetIteratorGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = map.get(iterator.next());
}
long endTime = System.currentTimeMillis();
System.out.println("keySetIteratorGetKeyAndValue運行時間" + (endTime - startTime));
}

3、entrySet的for循環方式:

//只獲取key
public static void entrySetForGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetForGetKey運行時間" + (endTime - startTime));
}
//獲取key和value
public static void entrySetForGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetForGetKeyAndValue運行時間" + (endTime - startTime));
}

4、entrySet的iterator迭代器方式:

//只獲取key
public static void entrySetIteratorGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().getKey();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetIteratorGetKey運行時間" + (endTime - startTime));
}
//獲取key和value
public static void entrySetIteratorGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().getKey();
String value = iterator.next().getValue();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetIteratorGetKeyAndValue運行時間" + (endTime - startTime));
}

最終的運行結果為:

keySetForGetKey運行時間28
keySetForGetKeyAndValue運行時間43
keySetIteratorGetKey運行時間25
keySetIteratorGetKeyAndValue運行時間36
entrySetForGetKey運行時間27
entrySetForGetKeyAndValue運行時間28
entrySetIteratorGetKey運行時間25
entrySetIteratorGetKeyAndValue運行時間29

總結:

entrySet的方式整體都是比keySet方式要高一些( ★★★ 數據上表明:map.entrySet().iterator() 是最快的 );

單純的獲取key來說,兩者的差別並不大,但是如果要獲取value,還是entrySet的效率會更好,因為keySet需要從map中再次根據key獲取value,而entrySet一次都全部獲取出來;
iterator的迭代器方式比foreach的效率高。
二、foreach和iterator

其實foreach的語法只是對iterator進行了簡單的包裝,使用起來更加方便而已,但是如果在foreach循環體內,對集合元素進行刪除添加操作的時候,會報出ConcurrentModificationException,並發修改異常。如果需要在遍歷集合的時候對象集合中元素進行刪除操作,需要使用iterator的遍歷方式,iterator自帶的remove刪除方式不會報出異常。
---------------------
原文:https://blog.csdn.net/zajiayouzai/article/details/80922610 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM