for循环遍历HashMap的优化
程序员文章站
2022-07-04 14:13:45
...
for循环遍历HashMap常用的有4种方式。
通过hashMap.keySet()遍历
keySet()方法返回HashMap中的key值的集合,然后通过get()方法传入key值,可以得到key对应的value值。示例代码:
for (Integer key : hashMap.keySet()) {
int value = hashMap.get(key);
}
通过hashMap.values()遍历
values()方法返回HashMap中的value值的集合。示例代码:
for (Integer v : hashMap.values()) {
int value = v;
}
通过hashMap.entrySet()遍历 entrySet()方法返回HashMap中的key-value键值对集合。key和value一一对应,都可以获取到。示例代码:
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
int key = entry.getKey();
int value = entry.getValue();
}
通过Iterator遍历
以上3中遍历方式都可以获取结果集合的迭代器(Iterator),通过Iterator.next()方法遍历结果集.示例代码:
Iterator<Integer> integerIterator = hashMap.values().iterator();
while (integerIterator.hasNext()) {
int value = integerIterator.next();
}
package com.dashidan.profile;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 大屎蛋教程网-dashidan.com
* for循环中的效率优化
* Created by 大屎蛋 on 2018/5/22.
*/
public class Demo2 {
public static void main(String[] args) {
int count = 1000000;
/** 初始化HashMap*/
HashMap<Integer, Integer> hashMap = new HashMap<>();
long t0 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
hashMap.put(i, i);
}
/** 遍历Key获取Value*/
long t1 = System.currentTimeMillis();
for (Integer key : hashMap.keySet()) {
int value = hashMap.get(key);
}
/** 遍历value*/
long t2 = System.currentTimeMillis();
for (Integer v : hashMap.values()) {
int value = v;
}
long t3 = System.currentTimeMillis();
/** 遍历Entry*/
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
int key = entry.getKey();
int value = entry.getValue();
}
long t4 = System.currentTimeMillis();
/** Iterator 遍历*/
Iterator<Integer> integerIterator = hashMap.values().iterator();
while (integerIterator.hasNext()) {
int value = integerIterator.next();
}
long t5 = System.currentTimeMillis();
System.out.println(t1 - t0);
System.out.println(t2 - t1);
System.out.println(t3 - t2);
System.out.println(t4 - t3);
System.out.println(t5 - t4);
}
}
总体说来,HashMap的put方法耗时会多余get方法。通过遍历keySet,然后再通过key获取value的方式效率最低。其余集中方式效率差不多。
结论:
如果只需要遍历value值,推荐采用遍历values()集合的方式。
如果遍历hashmap时,key和value都需要用到,推荐采用遍历entrySet的方式.
通过hashMap.keySet()遍历
keySet()方法返回HashMap中的key值的集合,然后通过get()方法传入key值,可以得到key对应的value值。示例代码:
for (Integer key : hashMap.keySet()) {
int value = hashMap.get(key);
}
通过hashMap.values()遍历
values()方法返回HashMap中的value值的集合。示例代码:
for (Integer v : hashMap.values()) {
int value = v;
}
通过hashMap.entrySet()遍历 entrySet()方法返回HashMap中的key-value键值对集合。key和value一一对应,都可以获取到。示例代码:
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
int key = entry.getKey();
int value = entry.getValue();
}
通过Iterator遍历
以上3中遍历方式都可以获取结果集合的迭代器(Iterator),通过Iterator.next()方法遍历结果集.示例代码:
Iterator<Integer> integerIterator = hashMap.values().iterator();
while (integerIterator.hasNext()) {
int value = integerIterator.next();
}
package com.dashidan.profile;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 大屎蛋教程网-dashidan.com
* for循环中的效率优化
* Created by 大屎蛋 on 2018/5/22.
*/
public class Demo2 {
public static void main(String[] args) {
int count = 1000000;
/** 初始化HashMap*/
HashMap<Integer, Integer> hashMap = new HashMap<>();
long t0 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
hashMap.put(i, i);
}
/** 遍历Key获取Value*/
long t1 = System.currentTimeMillis();
for (Integer key : hashMap.keySet()) {
int value = hashMap.get(key);
}
/** 遍历value*/
long t2 = System.currentTimeMillis();
for (Integer v : hashMap.values()) {
int value = v;
}
long t3 = System.currentTimeMillis();
/** 遍历Entry*/
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
int key = entry.getKey();
int value = entry.getValue();
}
long t4 = System.currentTimeMillis();
/** Iterator 遍历*/
Iterator<Integer> integerIterator = hashMap.values().iterator();
while (integerIterator.hasNext()) {
int value = integerIterator.next();
}
long t5 = System.currentTimeMillis();
System.out.println(t1 - t0);
System.out.println(t2 - t1);
System.out.println(t3 - t2);
System.out.println(t4 - t3);
System.out.println(t5 - t4);
}
}
总体说来,HashMap的put方法耗时会多余get方法。通过遍历keySet,然后再通过key获取value的方式效率最低。其余集中方式效率差不多。
结论:
如果只需要遍历value值,推荐采用遍历values()集合的方式。
如果遍历hashmap时,key和value都需要用到,推荐采用遍历entrySet的方式.