遍历 Map 输出键值对有俩种方法。
比较常用的 keySet():
HashMap<String,String> hm = new HashMap<String,String>();
hm.put("name", "pioneer");
hm.put("age", "12");
for( String s : hm.keySet()){
System.out.println(s + " : " + hm.get(s));
}
entrySet():
HashMap<String,String> hm = new HashMap<String,String>();
hm.put("name", "pioneer");
hm.put("age", "12");
for( Entry e : hm.entrySet()){
System.out.println(e.getKey() + " : " + e.getValue());
}
- Set<K> keySet() :返回值是个只存放 key 值的 Set 集合(集合中无序存放的),迭代后只能通过 get() 取key。
- Set<Map.Entry<K,V>> entrySet() : 返回映射所包含的映射关系的 Set 集合(一个关系就是一个键-值对),就是把( key-value )作为一个整体一对一对地存放到 Set 集合当中的。迭代后可以 e.getKey(),e.getValue() 取 key 和 value 。返回的是 Entry 接口。
性能辟谣
网上很多资料说 : keySet() 的速度比 entrySet() 慢了很多,也就是 keySet 方式遍历 Map 的性能不如 entrySet 性能好,为了提高性能,以后多考虑用 entrySet() 方式来进行遍历。
但实践是检验真理的唯一标准。
HashMap<String,String> hm = new HashMap<String,String>();
for(int i = 0; i <= 1000000; i++){
hm.put("name" + i, "pioneer" + i);
}
long startTime0 = System.currentTimeMillis();
for( String s : hm.keySet()){
System.out.println(s + " : " + hm.get(s));
}
long ktime = System.currentTimeMillis() - startTime0;
long startTime1 = System.currentTimeMillis();
for( Entry e : hm.entrySet()){
System.out.println(e.getKey() + " : " + e.getValue());
}
long etime = System.currentTimeMillis() - startTime1;
System.out.println("keySet use : " + ktime);
System.out.println("entrySet use : " + etime);
上面的代码运行结果是:
我们换成另外一种遍历方式:
HashMap<String, String> keySetMap = new HashMap<String, String>();
HashMap<String, String> entrySetMap = new HashMap<String, String>();
for (int i = 0; i < 1000000; i++) {
keySetMap.put("" + i, "keySet");
}
for (int j = 0; j < 1000000; j++) {
entrySetMap.put("" + j, "entrySet");
}
//keySet实验:1000000条数据,用时
long startTimeOne = System.currentTimeMillis();
Iterator<String> keySetIterator = keySetMap.keySet().iterator();
while (keySetIterator.hasNext()) {
String key = keySetIterator.next();
String value = keySetMap.get(key);
System.out.println(value);
}
long value = System.currentTimeMillis() - startTimeOne;
//entrySet实验:1000000条数据,用时
long startTimeTwo = System.currentTimeMillis();
Iterator<Entry<String, String>> entryKeyIterator = entrySetMap
.entrySet().iterator();
while (entryKeyIterator.hasNext()) {
Entry<String, String> e = entryKeyIterator.next();
System.out.println(e.getValue());
}
System.out.println("keyset spent times:"
+ value);
System.out.println("entrySet spent times:"
+ (System.currentTimeMillis() - startTimeTwo));
运行结果是:
我们可以看到,entrySet 并没有比 keySet 方法遍历快。笔者的 jdk 版本是 1.7 ,据笔者推断网上居多的 entrySet 性能比 keySet 好是因为之前低版本的时候是这样,但现在 java 开发团队优化了 keySet ,所以俩者的性能没有多大区别。
2021.3.3更新---
entrySet的性能确实更好,可看如下:https://stackoverflow.com/questions/3870064/performance-considerations-for-keyset-and-entryset-of-map