Java HashMap遍历几种方式
2017-10-11 21:19
369 查看
概述
遍历HashMap有三种情况:遍历key+value,遍历key,遍历value。常用的方法有两种:keySet方法,entrySet方法等。遍历key+value
keySet()方法:iterator 形式
public class Demo01 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); Iterator<String> iterator = map.keySet().iterator(); while(iterator.hasNext()) { String k = iterator.next(); String v = map.get(k); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
foreach形式:
public class Demo02 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); for(String k : map.keySet()) { String v = map.get(k); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
entrySet()方法:
iterator形式:
public class Demo03 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); while(iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); String k = entry.getKey(); String v = entry.getValue(); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
foreach形式:
public class Demo04 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { 4000 key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); for (Map.Entry<String, String> entry : map.entrySet()) { String k = entry.getKey(); String V = entry.getValue(); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
遍历key
keySet()方法iterator形式:
public class Demo05 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); Iterator<String> iterator = map.keySet().iterator(); while(iterator.hasNext()) { String k = iterator.next(); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
foreach形式:
public class Demo06 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); for(String k : map.keySet()) { System.out.println(k); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
entrySet()方法
iterator形式:
public class Demo07 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); while(iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); String k = entry.getKey(); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
foreach形式:
public class Demo08 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); for (Map.Entry<String, String> entry : map.entrySet()) { String k = entry.getKey(); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
遍历value
keySet和entrySet类似与Demo01到Demo04,除了keySet和entrySet方法,遍历vlaue还有values()方法:public class Demo09 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); StringBuilder key = new StringBuilder(); StringBuilder value = new StringBuilder(); for (int i = 0; i < 10000; i++) { key.append(String.valueOf(i)); value.append("value").append(String.valueOf(i)); map.put(key.toString(), value.toString()); } long start = System.currentTimeMillis(); for(String v : map.values()) { System.out.println(v); } long end = System.currentTimeMillis(); System.out.println("遍历所需时间:" + (end - start) + "ms"); } }
总结
同时遍历key和value时,keySet与entrySet方法的性能差异取决于key的具体情况,如复杂度(复杂对象)、离散度、冲突率等。换言之,取决于HashMap查找value的开销。entrySet一次性取出所有key和value的操作是有性能开销的,当这个损失小于HashMap查找value的开销时,entrySet的性能优势就会体现出来。当key是最简单的数值字符串时,keySet可能反而会更高效,耗时比entrySet少。总体来说还是推荐使用entrySet。因为当key很简单时,其性能或许会略低于keySet,但却是可控的;而随着key的复杂化,entrySet的优势将会明显体现出来。当然,我们可以根据实际情况进行选择只遍历key时,keySet方法更为合适,因为entrySet将无用的value也给取出来了,浪费了性能和空间。
只遍历value时,使用vlaues方法是最佳选择,entrySet会略好于keySet方法。
在不同的遍历写法中,推荐使用foreach写法,其效率略高一些。
测试参考一位牛人实测给出
http://www.cnblogs.com/fczjuever/archive/2013/04/07/3005997.html
相关文章推荐
- Java中HashMap遍历几种方式
- Java -- HashMap的四种遍历方式
- HashMap遍历的几种方式
- java集合的几种遍历方式详解
- Java中HashMap遍历的两种方式
- Java HashMap遍历实践,看看不同方式的性能如何
- Java种遍历Map集合的几种常用方式
- Java中HashMap遍历的两种方式
- Java中HashMap遍历的两种方式
- Java中HashMap遍历的两种方式
- Java中HashMap遍历的两种方式
- Java中HashMap遍历的四种方式
- Java中HashMap遍历的两种方式
- Java中HashMap遍历的两种方式
- Java中HashMap遍历的两种方式
- Java HashMap 遍历方式探讨
- Java中HashMap遍历的两种方式
- Java HashMap遍历方式性能探讨
- java的集合 Map集合,HashMap集合,LinkedHashMap集合 使用方式及遍历
- Java中HashMap遍历的两种方式