需要导入的包
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);
}
运行效果图:
注意: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) + "毫秒");
}
}
运行效果图:
从图中可知,方式一和方式六分别耗时最少。因此,当key和value都需要获取时推荐使用第一种方式;当只需要获取value时推荐使用第六种方式。