HashMap遍历效率问题

对于HashMap中的Key和Value的遍历有两种方法:

1.通过HashMap.keySet()方法返回key的集合,通过遍历该集合的key得到相应的value值。

Map map = new HashMap();

Iterator iter = map.keySet().iterator();

while (iter.hasNext()) {

Object key = iter.next();

Object val = map.get(key);

}

2.通过HashMap.entrySet()方法返回整个Entry<K,V>对象的集合,遍历该集合中的每一个键值对Map.Entry类型,Entry.getValue() Entry.getKey()得到相应的值和键。

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();

}

两种方法虽然可以得到相同的结果,但是在效率上还是存在差别。

因为在第一种方式中遍历每一个key并通过HashMap.get(object key)来得到相应的值时,实际上这个过程会再次去遍历整个Entry 集合,以下是HashMap中的JDK1.6源码:

public V get(Object key) {

        if (key == null)

            return getForNullKey();

        int hash = hash(key.hashCode());

        for (Entry<K,V> e = table[indexFor(hash, table.length)];

             e != null;

             e = e.next) {

            Object k;

            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

                return e.value;

        }

        return null;

    }

 

因此第二种方法的效率会要高一些,经过测试发现的确也是这样的。

两个方法还有一个区别就是:第二种方法明显的要耗费更多的内存,因为Entry<K,V>肯定会比单独的Set<K>要大。

 

你可能感兴趣的:(HashMap)