您的位置:首页 > 编程语言 > Java开发

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 遍历