Java中四種遍歷集合的方法
迭代是集合中進行的基本操作之一。基本上,迭代是從一個到另一個集合
比如,你想在一個班級中遍歷所有的學生打印出他們的名字或找到在最近的考試中的最高分是誰。或者你想遍歷一組數字計算和或平均值。這樣的操作在編程中是十分常見的。
Java提供了四種在集合上遍歷的方法,包括循環,迭代和forEach(從Java 8開始)
before going to each kind of iteration, suppose that we have a List collection as follows:
在學習每種遍歷方式之前,我們需要現有一組List集合:
public static void main(String[] args) { List<String> listNames = new ArrayList<>(); listNames.add("qiuqiu"); listNames.add("kaka"); listNames.add("beibei"); listNames.add("hutu"); listNames.add("wangzai"); }
This list contains names of all students in a class. Note that the diamond operator <> used in the right side of the assignment:
這個list包含我們小區的所有小狗的名字。注意在語句的右邊<>的使用
ArrayList<>();
1
這個語法從Java7開始使用,允許我們以一種更嚴謹的方式聲明泛型的集合,因為編譯器可以從左邊推測出右邊的參數類型(因此叫做“類型引用”)
1. 經典循環方式
這種迭代方法在編程中非常熟悉,其中計數器變量從集合中的第一個元素運行到最后一個元素
1 for (int i = 0; i < listNames.size(); i++) { 2 String name = listNames.get(i); 3 System.out.println(name); 4 }
pros:
- 這是編程中最熟悉的構造
- 如果我們需要訪問並使用計數器變量,比如打印小狗狗們的的數字順序:1,2,3……
cons:
- 使用計數器變量要求集合必須以基於索引的形式(如ArrayList)存儲元素,並且我們必須提前知道集合的大小
該集合必須提供一種通過基於索引的方式訪問其元素的方法,這不是所有集合都支持的方式,例如, Set不會將元素存儲為基於索引的元素。 因此這種方法不能用於所有集合。
2. 迭代的方式
由於經典循環方式的限制,創建了使用迭代器的方式,這種方式允許我們迭代各種集合。因此你可以看到Collection接口定義了每個集合必須實現iterator()方法
在List上用迭代器遍歷:
1 Iterator<String> itr = listNames.iterator(); 2 3 while (itr.hasNext()) { 4 String name = itr.next(); 5 System.out.println(name); 6 }
在Set上用迭代器遍歷:
1 Set<String> set = new HashSet<>(); 2 3 set.add("a"); 4 set.add("b"); 5 set.add("c"); 6 set.add("d"); 7 8 Iterator<String> itr = set.iterator(); 9 10 while (itr.hasNext()) { 11 String letter = itr.next(); 12 System.out.println(letter); 13 }
在Map上用迭代器遍歷:
1 Map<String, Integer> grade = new HashMap<>(); 2 grade.put("Operating System", 90); 3 grade.put("Computer Network", 92); 4 grade.put("Software Engineering", 90); 5 grade.put("Oracle", 90); 6 //Map迭代器 7 Iterator<String> itr = grade.keySet().iterator(); 8 while (itr.hasNext()) { 9 String key = itr.next(); 10 Integer value = grade.get(key); 11 System.out.println(key + "=>" + value); 12 } 13 //Map迭代器2 14 Iterator<Map.Entry<String, Integer>> entries = grade.entrySet().iterator(); 15 while (entries.hasNext()) { 16 Map.Entry<String, Integer> entry = entries.next(); 17 System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); 18 }
3. 加強for循環
從Java 5開始,程序員可以使用一種更簡潔的語法來遍歷集合-加強for循環。
1 for (String s : listNames) { 2 System.out.println(s); 3 }
The enhanced for loop actually uses an iterator behind the scenes. That means the Java compiler will convert the enhanced for loop syntax to iterator construct when compiling. The new syntax just gives the programmers a more convenient way for iterating over collections.
注意:
加強for循環實際上在背后使用的是迭代器。這意味着編譯時Java編譯器會將增強型for循環語法轉換為迭代器構造。 新的語法為程序員提供了一種更方便的迭代集合的方式。
4. 使用Lambda表達式的forEach
Java 8引入了Lambda表達式,介紹了一種遍歷集合的全新方式-forEach方法
1 listNames.forEach(name -> System.out.println(name));
forEach方法與之前的方法最大的區別是什么?
在之前的方法中(經典for循環,迭代器和加強for循環),程序員可以控制集合是如何迭代的。迭代代碼不是集合本身的一部分 - 它是由程序員編寫的 - 因此稱為外部迭代。
相比之下,新方法將迭代代碼封裝在集合本身中,因此程序員不必為迭代集合編寫代碼。 相反,程序員會在每次迭代中指定要做什么 - 這是最大的區別! 因此術語內部迭代:集合處理迭代本身,而程序員傳遞動作 - 即每次迭代需要做的事情。
文章大部分參考於:
http://www.codejava.net/java-core/collections/the-4-methods-for-iterating-collections-in-java