java 高效的hashmap遍历方法

Hashmap的遍历,key和value通常的方法有两种,及使用entryset或者keyset遍历,下面我们来看下实例。

public class TestHashMap {	

private static void test1(){//效率低

Map<String,String> map = new HashMap<String,String>();

long time1 = System.currentTimeMillis();

for (int i = 0; i < 100000; i++) {

map.put("two"+i, 2+"");

map.put("three"+i, 3+"");

map.put("four"+i, 4+"");

map.put("five"+i, 5+"");

}

for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext();) {

String s = iterator.next();

String m = map.get(s);

}

long time2 = System.currentTimeMillis();

long time = time2-time1;

System.out.println(time);

}

private static void test2(){//效率高

Map<String,String> map = new HashMap<String,String>();

long time1 = System.currentTimeMillis();

for (int i = 0; i < 100000; i++) {

map.put("two"+i, 2+"");

map.put("three"+i, 3+"");

map.put("four"+i, 4+"");

map.put("five"+i, 5+"");

}

for (Iterator<Entry<String, String>> iterator = map.entrySet().iterator(); iterator.hasNext();) {

Entry<String, String> s = iterator.next();

String m = s.getValue();

String n = s.getKey();

}

long time2 = System.currentTimeMillis();

long time = time2-time1;

System.out.println(time);

}

public static void main(String[] args){

test1();

test2();

}

}

Hashmap是一个通过散列表实现的存储,底层是数组存放的元素,而hashmap的一个元素就是一个entry,也就是一个key-value的键值对,所以通过entry的遍历可以一次获取到key-value的键值对。但是通过keyset遍历的话,是先set集合里取出key,然后再通过map.get(key)活得value,通过hashmap源码分析得知,get(key)方法是又进行了一次迭代,找到entry,从而获得到的value,所以效率上用entry遍历更高。下面来看下map的get源码:

public V get(Object key) {

if (key == null) {

HashMapEntry<K, V> e = entryForNullKey;

return e == null ? null : e.value;

}

// Doug Lea‘s supplemental secondaryHash function (inlined)

int hash = key.hashCode();

hash ^= (hash >>> 20) ^ (hash >>> 12);

hash ^= (hash >>> 7) ^ (hash >>> 4);

HashMapEntry<K, V>[] tab = table;

for (HashMapEntry<K, V> e = tab[hash & (tab.length - 1)];

e != null; e = e.next) {

K eKey = e.key;

if (eKey == key || (e.hash == hash && key.equals(eKey))) {

return e.value;

}

}

return null;

}

通过源码分析得知,当通过 key 取出对应 value 时,系统只要先计算出该 key 的 hashCode() 返回值,在根据该 hashCode 返回值找出该 key 在 table 数组中的索引,取出该索引处的 Entry,最后返回该
key 对应的 value 即可,此时如果对应的索引只存取一个entry,效率最高,但是如果hash冲突导致,存储的是一个entry链,就需要遍历找到需要的entry,这时候效率就要下降了。

但是大家有没有发现hashmap遍历是无序的呢,我们会在接下来的文章给大家讲解,谢谢。

时间: 2024-10-10 01:33:07

java 高效的hashmap遍历方法的相关文章

Java List Map集合遍历方法

Map遍历 方法一 在for-each循环中使用entries来遍历 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. [java] view plain copy Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println(&qu

HashMap遍历方法

http://jiankeafei.iteye.com/blog/286017 在java中使用HashMap是主要有两种遍历方法,代码如下: 第一种: HashMap hashmap = new HashMap(); Iterator iterator = hashmap.keySet().iterator(); while (iterator.hasNext()) { Object value = hashmap.get(iterator.next()); } 第二种: HashMap ha

java list三种遍历方法性能比較

从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象,測试代码例如以下: package com.hisense.tiger.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListTest { publi

Java中的HashMap遍历

import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "a"); map.put(2, "b

java中对HashMap遍历的方式

第一种是利用HashMap的entrySet()方法: Map<String,String> map = new HashMap<String,String>(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String key = entry.getKey(); String val = entry.g

Map、List、Set在Java中的各种遍历方法

一.Map的4种遍历 Map<String, String> map = new HashMap<String, String>(); map.put("姓名", "张三"); map.put("属性", "好人"); 1.普遍使用,二次取值 for (String key : map.keySet()) { System.out.println(key + map.get(key)); } 2.通过M

java list三种遍历方法性能比较

public static void compare() { List<String> list = new ArrayList<String>(); Set<String> set = new HashSet<String>(); for(int i=0;i<100000;i++) { list.add("a"+i); } long t1=0L,t2=0L; t1 = System.currentTimeMillis(); for

Java ArrayList几种遍历方法

import java.util.ArrayList; import java.util.Iterator; public class StringSampleDemo { public static void main(String[] args) { ArrayList al = new ArrayList(); al.add("1"); al.add("2"); al.add("3"); al.add("4"); //

【Java】用JDK1.5之后的新型数组遍历方法遍历HashMap、HashMap不应该存储多元组

在JDK1.5就多了一种for循环的遍历写法,现在应该没有人用JDK1.4了吧?我见那些2005年出的JAVA书,谭浩强系列的JAVA书都是使用JDK1.5了,当然JDK1.7已经使用的,据说JDK1.7是兼容JDK1.2~JDK1.7,现在的JAVA编程都是基于JDK1.5的.然而由于考试不要求或者其它什么原因,它并不受程序猿的青睐,而在平常实践用,旧式的循环中用多了,老程序猿依旧作为开发主力的情况,也就没有人敢于尝试这种新型的数组遍历方法了,其实这种方法在遍历HashMap的时候尤其有用,能