同系列文章
java 中 List 的5种遍历方式
Java 中 Set 的4中遍历方式
Java 中 Map 的5种遍历方式
主测试方法
@Test
public void test1(){
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int n = 1000_0000;
for (int i = 1; i <= n; i++) {
map.put(i, i);
}
System.out.println("======== 1 entrySet 最常用 ==========");
entrySetTest(map);
System.out.println("======== 2 keySet Or Values 取keys或values 时,效率最高 ==========");
keySetOrValuesTest(map);
//("======== keySetForValueTest ==========");
keySetForValueTest(map);
System.out.println("======== 3 iterator Type ==========");
iteratorTypeTest(map);
System.out.println("======== 4 forEach java 8 效率最低 ==========");
forEachTest(map);
System.out.println("======== 5 stream ForEach java 8 流式 ==========");
streamForEachTest(map);
}
1000万数据测试结果
======== 1 entrySet 最常用 ==========
map.entrySet() time= 65
======== 2 keySet Or Values 取keys或values 时,效率最高 ==========
map.keySet() time= 71
map.keySet().iterator() time= 63
map.values() time= 74
map.values().iterator() time= 64
map.keySet() -> map.get(key) time= 107
======== 3 iterator Type ==========
map.entrySet().iterator() time= 85
======== 4 forEach java 8 效率最低 ==========
map.forEach time= 103
======== 5 stream ForEach java 8 流式 ==========
map.entrySet().stream().forEach time= 62
1、最常用的方法,() 加增强for
/**
* 1
* entrySet 这是最常用的方式,在键值都需要的时候
* @param map
*/
public void entrySetTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
entry.getKey();
entry.getValue();
// ("Key = " + () + ", Value = " + ());
}
long after = System.currentTimeMillis();
System.out.println("() time=\t" + (after - before));
}
2、通过keySet() 或 values()获取
/**
* 2(1)keySet values
* 如果只需要键或者值,这个比键值对的要快
* @param map
*/
public void keySetOrValuesTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
// 遍历map中的键
for (Integer key : map.keySet()) {
//("Key = " + key);
}
long after = System.currentTimeMillis();
System.out.println("() time=\t" + (after - before));
before = System.currentTimeMillis();
// 遍历map中的键
Iterator<Integer> iteratorKeySet = map.keySet().iterator();
while (iteratorKeySet.hasNext()) {
iteratorKeySet.next();
//("key = " + ());
}
after = System.currentTimeMillis();
System.out.println("().iterator() time=\t" + (after - before));
before = System.currentTimeMillis();
// 遍历map中的值
for (Integer value : map.values()) {
//("Value = " + value);
}
after = System.currentTimeMillis();
System.out.println("() time=\t" + (after - before));
before = System.currentTimeMillis();
// 遍历map中的值
Iterator<Integer> iteratorValues = map.values().iterator();
while (iteratorValues.hasNext()) {
iteratorValues.next();
//("key = " + ());
}
after = System.currentTimeMillis();
System.out.println("().iterator() time=\t" + (after - before));
}
/**
* 2(2)keySet get
* 根据键找值,效率很低
* @param map
*/
public void keySetForValueTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
//遍历map中的键
for (Integer key : map.keySet()) {
Integer value = map.get(key);
//("Key = " + key + ", Value = " + value);
}
long after = System.currentTimeMillis();
System.out.println("() -> (key) time=\t" + (after - before));
}
3、通过迭代器 ().iterator()
/**
* 3(1)iterator type
* 迭代器 带泛型
* @param map
*/
public void iteratorTypeTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
Integer key = entry.getKey();
Integer value = entry.getValue();
//("Key = " + () + ", Value = " + ());
}
long after = System.currentTimeMillis();
System.out.println("().iterator() time=\t" + (after - before));
}
4、 注意:java8 才支持
/**
* 4 forEach 遍历的是键值,所以是两个参数
* forEach java8 lambda
* @param map
*/
public void forEachTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
//( (key,value) -> {("Key = " + key+ ", Value = "+ value);} );
map.forEach( (key,value) -> {} );
long after = System.currentTimeMillis();
System.out.println(" time=\t" + (after - before));
// 一条语句可以省略{}
//( (key,value) -> ("Key = " + key+ ", Value = "+ value) );
}
5、().stream().forEach 注意:java8 才支持
/**
* 5 stream forEach 遍历的是entry 所以是一个参数
* stream forEach java8 lambda
* @param map
*/
public void streamForEachTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
//().stream().forEach( (entry) -> {("Key = " + ()+ ", Value = "+ ());} );
//().stream().forEach( ::println);
map.entrySet().stream().forEach( (entry) -> {} );
long after = System.currentTimeMillis();
System.out.println("().stream().forEach time=\t" + (after - before));
// 一个参数可以省略() 一条语句可以省略{}
//().stream().forEach(entry -> ("Key = " + ()+ ", Value = "+ ()) );
}