HashMap遍历方式比较

Table of Contents

 

 

HashMap遍历方式比较

一、HashMap的遍历获取到value的几种方式

二、代码

三、结果

四、思考


 

HashMap遍历方式比较

一、HashMap的遍历获取到value的几种方式

1、先通过获取到keySet,遍历keyset中的key,通过key去获取到value;

2、获取到map.values(),遍历获取到value值;

3、获取到entrySet(),通过遍历entry,通过entry可获取到value(或者key)。

二、代码

public class MainActivity extends Activity {

    HashMap<String, String> hashmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        hashmap = new java.util.HashMap();
        for (int i = 0; i < 1000000; i++) {
            hashmap.put(""+i, "thanks");
        }
    }

public void test(View view) {
    //第一种方式:通过遍历Map.keySet()遍历HashMap的key和value
    firstMethod(hashmap);

    //第二种方式:通过遍历values()遍历Map的value,但是不能遍历key
    secondMethod1(hashmap);
    secondMethod2(hashmap);

    //第三种方式:通过Map.entrySet()使用iterator()遍历HashMap的key和value
    thirdMethod1(hashmap);
    thirdMethod2(hashmap);
}



private static void firstMethod(Map<String, String> map) {
    long startTime = System.currentTimeMillis();
    for (String key : map.keySet()) {
    }
    Log.v("testMap","第一种1耗时:"+(System.currentTimeMillis() - startTime));

    long startTime2 = System.currentTimeMillis();
    Iterator iterator2 = map.keySet().iterator();
    while (iterator2.hasNext())
    {
        Object key2 = iterator2.next();
    }
    Log.v("testMap","第一种2耗时:"+(System.currentTimeMillis() - startTime2));
}


private static void secondMethod1(Map<String, String> map) {
    long startTime = System.currentTimeMillis();
    Collection<String> values = map.values();
    for(Iterator<String> it2 = values.iterator();it2.hasNext();){
        it2.next();
    }

    Log.v("testMap","第二种1耗时:"+(System.currentTimeMillis() - startTime));
}

private static void secondMethod2(Map<String, String> map) {
    long startTime = System.currentTimeMillis();
    for (String v : map.values()) {

    }
   Log.v("testMap","第二种2耗时:"+(System.currentTimeMillis() - startTime));
}


private static void thirdMethod1(Map<String, String> map) {

    long startTime = System.currentTimeMillis();
    Iterator<Map.Entry<String, String>> it3 = map.entrySet().iterator();
    while(it3.hasNext()){
        Map.Entry<String, String> entry = it3.next();
  //      entry.getKey();
        entry.getValue();
    }

    Log.v("testMap","第三种1耗时:"+(System.currentTimeMillis() - startTime));
}

private static void thirdMethod2(Map<String, String> map) {
    long startTime = System.currentTimeMillis();
    //map容量大时用此种遍历方式
    for (Map.Entry<String, String> entry : map.entrySet()) {
//       entry.getKey();
        entry.getValue();
    }
    Log.v("testMap","第三种2耗时:"+(System.currentTimeMillis() - startTime));
}

三、结果

打印结果

07-23 12:36:52.334 3680-3680/com.rrjc.testhashmap V/testMap: 第一种1耗时:538

07-23 12:36:52.662 3680-3680/com.rrjc.testhashmap V/testMap: 第一种2耗时:328

07-23 12:36:53.012 3680-3680/com.rrjc.testhashmap V/testMap: 第二种1耗时:350

07-23 12:36:53.362 3680-3680/com.rrjc.testhashmap V/testMap: 第二种2耗时:350

07-23 12:36:53.745 3680-3680/com.rrjc.testhashmap V/testMap: 第三种1耗时:383

07-23 12:36:54.129 3680-3680/com.rrjc.testhashmap V/testMap: 第三种2耗时:384

四、思考

1、从第一种方式可看出,map去获取key的时候耗时就特别长,如果再去通过该key去获取value则需花费更长的时间;

其他的第二种和第三种方式耗时差不多。

2、不少人经常争论是通过迭代器模式还是通过foreach的方式,哪种更快?而实验已经给出了结论,这两种都差不多。

3、但同时即使数据量已经如此大了,其实他们的迭代效率并非有显著的差异。

4、最后,有喜欢研究的小伙伴可以去研究一下为什么map去获取key的时候如此耗时呢?

猜你喜欢

转载自blog.csdn.net/u010375903/article/details/81228324