真实案例
(上图来自网上真实帖子案例 o_O)
遵循程序设计基本原则,要先写测试代码:
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, "aaa");
map.put(2, "bbb");
map.put(3, "ccc");
map.put(4, "ddd");
map.put(5, "eee");
mapTraverse1(map); // ①
mapTraverse2(map); // ②
mapTraverse3(map); // ③
mapTraverse4(map); // ④
mapTraverse5(map); // ⑤
}
}
1. foreach直接方式(推荐)
foreach用法:
for (数据类型 变量名 : 容器名称) {
//可遍历集合或数组(常用在无序集合上)
}
① entrySet() + foreach直接遍历
第一种map遍历方法:entrySet() + foreach直接遍历
说明:①简洁;②适用于map容量大的时候;③遍历时,如果改变其大小,会报错(ConcurrentModificationException)
public static void mapTraverse1(Map<Integer, String> map) {
for (Map.Entry<Integer, String> m : map.entrySet()) {
//map.put(6, "fff"); // Error: java.util.ConcurrentModificationException
System.out.println("key=" + m.getKey() + " value=" + m.getValue());
}
}
② keySet() + foreach直接遍历
第二种map遍历方法:keySet() + foreach直接遍历
说明:①简洁;②效率不如entrySet()不是最优选择;③且遍历时,如果改变其大小,会报错
public static void mapTraverse2(Map<Integer, String> map) {
for (Integer key : map.keySet()) {
//map.put(6, "fff"); // Error: java.util.ConcurrentModificationException
System.out.println("key=" + key + " value=" + map.get(key));
}
}
2. iterator接口方法
③ entrySet() + iterator()迭代器方法.next()遍历
第三种map遍历方法:entrySet() + iterator()迭代器方法.next()遍历
说明:可使用Iterator的remove方法删除最后1个元素,放在循环内则会将源map全部元素删除
public static void mapTraverse3(Map<Integer, String> map) {
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());
}
//从底层集合中删除此迭代器返回的最后一个元素 (5, "eee")
//下一次重新遍历map的时候才会看到remove结果
//it.remove();
}
④ keySet() + iterator()迭代器方法.next()遍历
第四种map遍历方法:keySet() + iterator()迭代器方法.next()
说明:可使用Iterator的remove方法删除最后1个元素,放在循环内则会将源map全部元素删除
public static void mapTraverse4(Map<Integer, String> map) {
for (Iterator<?> i = map.keySet().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println("key=" + obj + " value=" + map.get(obj));
//i.remove(); //循环内调用会删除源map所有key,value
}
}
3. ⑤ values()方法单独遍历
第五种map遍历方法:values()方法单独遍历输出value
说明:只能遍历value,不能遍历key,按需使用
public static void mapTraverse5(Map<Integer, String> map) {
for (Iterator<?> i = map.values().iterator(); i.hasNext();) {
System.out.println("value=" + i.next());
}
}