一般用的時候分爲以下幾種情況。
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);
}
}
}