一般用的时候分为以下几种情况。
For-Each循环是Java5新引入的,遍历的map是null的话,For-Each循环会抛出NullPointerException异常,所以在遍历之前你应该判断是否为空引用。
1. 遍历key(比entrySet迭代快一点点)
这个方法比entrySet迭代具有轻微的性能优势(大约快10%)
for(Integer key: map.keySet()){
System.out.println(key);
}
2. 遍历value(比entrySet迭代快一点点)
这个方法比entrySet迭代具有轻微的性能优势(大约快10%)
for(Integer value : map.values()){
System.out.println(value);
}
3. 同时遍历key和value
可以用以下几种方式。
3.1 用entrySet() + foreach (用!)
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
System.out.println(entry.getKey()+" " +entry.getValue());
}
3.2 用entrySet() + 迭代器 (使劲用!)
相当于获得键值对集合entry,并遍历
//返回的是entry<Integer,Integer>类型的迭代器
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
//返回时没声明it的类型,it.next()需要强转
// Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<Integer, Integer> entry = it.next();
System.out.println(entry.getKey() + " " +entry.getValue());
}
3.3 keySet + foreach (耗时,不推荐)
keySet拿到key,get一下就可以在同一个for循环内拿到value
这个方法看上去更简洁,但是实际上它更慢更低效,通过key得到value值更耗时。
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key+ " " +value);
}
3.4 用keySet+ 迭代器(耗时,不推荐)
获得键集合,并遍历,拿到key,通过key去get值。
这个方法看上去更简洁,但是实际上它更慢更低效,通过key得到value值更耗时。
//返回时声明了it是Integet类型的迭代器,不用强转
//Iterator<Integer> it = map.keySet().iterator();
//返回时没声明it的类型,it.next()需要强转
Iterator it = map.keySet().iterator();
while(it.hasNext()){
// Integer key = it.next();
Integer key = (Integer)it.next();
Integer value = map.get(key);
System.out.println(key + "" + value);
}
以上代码汇总后如下。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapTraversal {
public static void main(String[] args){
HashMap<Integer, Integer> map = new HashMap<>();
map.put(3, 6);
map.put(2, 5);
Traversal01(map);
Traversal02(map);
Traversal03(map);
Traversal04(map);
Traversal05(map);
}
// entrySet() 用for循环拿到entry
public static void Traversal01(HashMap<Integer, Integer> map){
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
System.out.println(entry.getKey()+" " +entry.getValue());
}
}
// keySet() 用for循环拿到key
public static void Traversal00(HashMap<Integer, Integer> map){
for(Integer key : map.keySet()){
Integer
System.out.println(entry.getKey()+" " +entry.getValue());
}
}
// 单独拿到keys(用keySet()) 或者单独拿到values(map.values())
public static void Traversal02(HashMap<Integer, Integer> map){
for(Integer key: map.keySet()){
System.out.println(key);
}
for(Integer value : map.values()){
System.out.println(value);
}
}
// keySet拿到key,get一下就可以在同一个for循环内拿到value
public static void Traversal03(HashMap<Integer, Integer> map){
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key+ " " +value);
}
}
// entryset迭代器 获得键值对集合entry,并遍历
public static void Traversal04(HashMap<Integer, Integer> map){
//返回的是entry<Integer,Integer>类型的迭代器
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
//返回时没声明it的类型,it.next()需要强转
// Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<Integer, Integer> entry = it.next();
System.out.println(entry.getKey() + " " +entry.getValue());
}
}
// keyset迭代器 获得键集合,并遍历,拿到key,通过key去get值。
public static void Traversal05(HashMap<Integer, Integer> map){
//返回时声明了it是Integet类型的迭代器,不用强转
//Iterator<Integer> it = map.keySet().iterator();
//返回时没声明it的类型,it.next()需要强转
Iterator it = map.keySet().iterator();
while(it.hasNext()){
// Integer key = it.next();
Integer key = (Integer)it.next();
Integer value = map.get(key);
System.out.println(key + "" + value);
}
}
}