Table of Contents
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的时候如此耗时呢?