需要导入的包

import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;

定义一个map集合

Map<String, String> map = new HashMap<>();
map.put("id", "1024");
map.put("name", "张三");
map.put("sex", "男");
map.put("age", "30");

方式一:使用for-each循环,通过Map.entrySet遍历key和value(当key和value都需要获取时推荐使用,效率较高)

for (Map.Entry<String, String> entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println("方式一:  " + "Key = " + key + "  ----  " + "Value = " + value);
}

方式二:使用while循环,通过迭代器进行遍历key和value

Iterator<Map.Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<String, String> entry = entries.next();
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println("方式二:  " + "Key = " + key + "  ----  " + "Value = " + value);
}

方式三:使用for循环,通过迭代器进行遍历key,再通过key来获取value。在不需要获取key的情况下,可以直接使用 Iterator i = map.values().iterator() 的方法来获取value

for (Iterator i = map.keySet().iterator(); i.hasNext(); ) {
    Object obj = i.next();
    if (obj instanceof String) {
        String key = (String) obj;
        System.out.println("方式三:  " + "Key = " + key + "  ----  " + "Value = " + map.get(key));
    }
}

方式四:使用for-each循环,通过Map.keySet遍历key,再通过key来获取value。在不需要获取key的情况下,可以直接使用 String value : map.values() 的方法来获取value

for (String key : map.keySet()) {
    String value = map.get(key);
    System.out.println("方式四:  " + "Key = " + key + "  ----  " + "Value = " + value);
}

方式五:使用for循环,通过迭代器进行遍历value,在不需要获取key的情况下,可以通过这种方式直接获取value

for (Iterator i = map.values().iterator(); i.hasNext(); ) {
    Object obj = i.next();
    if (obj instanceof String) {
        String value = (String) obj;
        System.out.println("方式五:  " + "Value = " + value);
    }
}

方式六:使用for-each循环,在不需要获取key的情况下,可以通过这种方式直接获取value(当只需要获取value时推荐使用)

for (String value : map.values()) {
    System.out.println("方式六:  " + "Value = " + value);
}

运行效果图:

android 对hashmap做了优化 android hashmap遍历_System

注意:for-each循环简化了集合的遍历,同时它也无法拿到集合的下标。

当key和value都需要获取的时候,推荐方式一;当只需要获取value的时候推荐方式六!

为什么分别推荐方式一和方式六呢?其实在这六种遍历方式中,我们要么是使用entrySet方法,要么是使用keySet方法。我们会发现使用entrySet会把键和值都取出来;使用keySet只会单独取出key,这个时候再去取value又是需要花时间的。因此我们可以写一个demo来测试一下它们之间的效率。

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    // 定义一个开始时间
    private long startTime = 0;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new Runnable() {
            @Override
            public void run() {
                test();
            }
        }).start();
    }

    /**
     * 测试代码
     */
    private void test() {
        // 定义一个map
        Map<String, String> map = new HashMap<>();
        // 通过循环添加10万数据
        for (int i = 0; i < 100000; i++) {
            // 添加键值
            map.put("key_" + i, "value_" + i);
        }

        // 重新赋值开始时间
        startTime = System.currentTimeMillis();
        // 方式一
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("方式一:  " + "Key = " + key + "  ----  " + "Value = " + value);
        }
        Log.e("TAG", "方式一耗时:  " + (System.currentTimeMillis() - startTime) + "毫秒");

        // 重新赋值开始时间
        startTime = System.currentTimeMillis();
        // 方式二
        Iterator<Map.Entry<String, String>> entries = map.entrySet().iterator();
        while (entries.hasNext()) {
            Map.Entry<String, String> entry = entries.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("方式二:  " + "Key = " + key + "  ----  " + "Value = " + value);
        }
        Log.e("TAG", "方式二耗时:  " + (System.currentTimeMillis() - startTime) + "毫秒");

        // 重新赋值开始时间
        startTime = System.currentTimeMillis();
        // 方式三
        for (Iterator i = map.keySet().iterator(); i.hasNext(); ) {
            Object obj = i.next();
            if (obj instanceof String) {
                String key = (String) obj;
                String value = map.get(key);
                System.out.println("方式三:  " + "Key = " + key + "  ----  " + "Value = " + value);
            }
        }
        Log.e("TAG", "方式三耗时:  " + (System.currentTimeMillis() - startTime) + "毫秒");

        // 重新赋值开始时间
        startTime = System.currentTimeMillis();
        // 方式四
        for (String key : map.keySet()) {
            String value = map.get(key);
            System.out.println("方式四:  " + "Key = " + key + "  ----  " + "Value = " + value);
        }
        Log.e("TAG", "方式四耗时:  " + (System.currentTimeMillis() - startTime) + "毫秒");

        // 重新赋值开始时间
        startTime = System.currentTimeMillis();
        // 方式五
        for (Iterator i = map.values().iterator(); i.hasNext(); ) {
            Object obj = i.next();
            if (obj instanceof String) {
                String value = (String) obj;
                System.out.println("方式五:  " + "Value = " + value);
            }
        }
        Log.e("TAG", "方式五耗时:  " + (System.currentTimeMillis() - startTime) + "毫秒");

        // 重新赋值开始时间
        startTime = System.currentTimeMillis();
        // 方式六
        for (String value : map.values()) {
            System.out.println("方式六:  " + "Value = " + value);
        }
        Log.e("TAG", "方式六耗时:  " + (System.currentTimeMillis() - startTime) + "毫秒");
    }

}

运行效果图:

android 对hashmap做了优化 android hashmap遍历_赋值_02

从图中可知,方式一和方式六分别耗时最少。因此,当key和value都需要获取时推荐使用第一种方式;当只需要获取value时推荐使用第六种方式。