HashMap中遍历的两种方式

根据jdk的api中的介绍,hashMap有以下特点:

1)允许使用 null 值和 null

2)非同步(同步需要封装:


<span style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px;">Map m = Collections.synchronizedMap(new HashMap(...));)</span>

3)HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。如果要保证遍历的效率,则不要将初始容量设置得太高(或将加载因子设置得太低)。默认的加载引子是0.75f。如果存储的entries不超过当前容量和加载因子的累积时,则不会发生 rehash 操作,这样效率查询和存储的效率都会较高(ps:。hashmap最大存储容量1<<30(即:2^30),初始容量是16(1<<4)

大部分情况下,都不会去更改初始容量和加载因子的,系统默认的0.75对时间和空间取了一种折中的方式。

在日常应用中常常会遍历hashmap,根据一个测试代码,发现下面两种遍历方式的效率截然不同。
一、

Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}

效率高,以后建议采用使用此种方式
二、

Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}

效率低,以后尽量少使用
两种方式的测试代码:

public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
for (int i = 0; i < 20000; i++) {
hashmap.put(i, "keyset");
}
long bs = Calendar.getInstance().getTimeInMillis();
Iterator<Integer> iterator = hashmap.keySet().iterator();
while (iterator.hasNext()) {
System.out.print(hashmap.get(iterator.next()));
}
System.out.println("\r\n---keyset遍历------" + bs);
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
listHashMap();
}
/**
*
* listHashMap 方法
* <p>方法说明:entry iterator</p>
*/
public static void listHashMap() {
HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
for (int i = 0; i < 20000; i++) {
hashmap.put(i, "entry");
}
long bs = Calendar.getInstance().getTimeInMillis();
Iterator<Entry<Integer, String>> it = hashmap.entrySet().iterator();
while (it.hasNext()) {
Entry<Integer, String> entry = it.next();
// entry.getKey() 返回与此项对应的键
// entry.getValue() 返回与此项对应的值
System.out.print(entry.getValue());
}
System.out.println("\r\n---keyEntry遍历------");
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
}
}

对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注