java 增強型for循環(huán)語法詳解
Java 增強型 for 循環(huán)(Enhanced for Loop)詳解
增強型 for
循環(huán)(也稱為 “for-each” 循環(huán))是 Java 從 JDK 5 開始引入的一種便捷循環(huán)語法,旨在簡化對數(shù)組或集合類的迭代操作。
1. 基本語法
語法格式
for (類型 變量 : 迭代對象) { // 循環(huán)體 }
類型
:迭代對象中元素的類型。變量
:每次迭代時,存儲當前元素的變量。迭代對象
:數(shù)組或?qū)崿F(xiàn)了Iterable
接口的集合(如List
、Set
等)。
2. 使用示例
2.1 遍歷數(shù)組
public class EnhancedForArray { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5}; for (int num : numbers) { System.out.println(num); // 輸出:1, 2, 3, 4, 5 } } }
2.2 遍歷集合
import java.util.ArrayList; import java.util.List; public class EnhancedForList { public static void main(String[] args) { List<String> fruits = new ArrayList<>(); fruits.add("Apple"); fruits.add("Banana"); fruits.add("Cherry"); for (String fruit : fruits) { System.out.println(fruit); // 輸出:Apple, Banana, Cherry } } }
3. 特性與限制
3.1 特性
簡潔性:
- 不需要手動管理索引或迭代器,代碼更易讀。
- 對比傳統(tǒng)
for
循環(huán),不需要獲取數(shù)組長度或調(diào)用集合的迭代器。
適用性廣泛:
- 可用于數(shù)組、
List
、Set
、Map
(遍歷entrySet()
、keySet()
或values()
)。
3.2 限制
無法修改集合結(jié)構(gòu):
- 增強型
for
循環(huán)中,不能直接對集合進行add
或remove
操作,否則會拋出ConcurrentModificationException
。 - 示例:
List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); for (String s : list) { if (s.equals("A")) { list.remove(s); // 會拋出異常 } }
如果需要修改集合結(jié)構(gòu),可以使用 迭代器:
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String s = iterator.next(); if (s.equals("A")) { iterator.remove(); // 安全地刪除元素 } }
無法訪問索引:
增強型 for
循環(huán)中無法直接獲取元素的索引。如果需要索引,需使用傳統(tǒng) for
循環(huán):
String[] fruits = {"Apple", "Banana", "Cherry"}; for (int i = 0; i < fruits.length; i++) { System.out.println("Index " + i + ": " + fruits[i]); }
只支持順序訪問:
適用于 Iterable
接口的集合(如 List
、Set
),不適用于需要隨機訪問的場景。
4. 遍歷 Map 的增強型 for
4.1 遍歷 keySet
遍歷 Map
的所有鍵:
import java.util.HashMap; import java.util.Map; public class EnhancedForMap { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("A", 1); map.put("B", 2); map.put("C", 3); for (String key : map.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); } } }
4.2 遍歷 entrySet
更高效地同時遍歷鍵和值:
for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); }
5. 適用場景
遍歷數(shù)組:
- 對于大小已知且不需要修改的數(shù)組,增強型
for
是最佳選擇。
遍歷集合:
- 遍歷
List
、Set
等集合,尤其是當集合不需要修改時。
遍歷 Map
:
- 使用
entrySet()
時,增強型for
簡潔而高效。
簡化代碼:
- 避免手動管理索引或迭代器。
6. 常見問題
6.1 為什么增強型 for 循環(huán)不能修改集合?
增強型 for
底層使用了 迭代器 來遍歷集合,如果直接修改集合結(jié)構(gòu)(如添加或刪除元素),會導(dǎo)致迭代器失效,拋出 ConcurrentModificationException
。
6.2 如何在增強型 for 中訪問索引?
可以在增強型 for
中手動維護索引:
String[] fruits = {"Apple", "Banana", "Cherry"}; int index = 0; for (String fruit : fruits) { System.out.println("Index " + index + ": " + fruit); index++; }
7. 底層實現(xiàn)
增強型 for
循環(huán)的本質(zhì)是使用了 迭代器 來實現(xiàn)的。
偽代碼
對于 Iterable
對象:
for (Type element : collection) { Iterator<Type> it = collection.iterator(); while (it.hasNext()) { Type element = it.next(); // 循環(huán)體 } }
對于數(shù)組:
for (Type element : array) { for (int i = 0; i < array.length; i++) { Type element = array[i]; // 循環(huán)體 } }
8. 總結(jié)
優(yōu)點
- 簡化代碼:適合大多數(shù)迭代場景,避免手動處理索引和迭代器。
- 可讀性高:語法簡潔,專注于元素處理。
缺點
- 不能直接操作索引。
- 不支持修改集合結(jié)構(gòu)。
- 適用于順序訪問,不適合隨機訪問場景。
增強型 for
循環(huán)是 Java 中對迭代器模式的進一步抽象,它讓遍歷變得更加簡單、高效,是開發(fā)中非常常用的工具。
到此這篇關(guān)于java 增強型for循環(huán) 詳解的文章就介紹到這了,更多相關(guān)java 增強型for循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于Java中增強for循環(huán)使用的注意事項
- JAVA Iterator接口與增強for循環(huán)的實現(xiàn)
- Java中使用增強for循環(huán)的實例方法
- Java中增強for循環(huán)的實現(xiàn)原理和坑詳解
- 詳談Java枚舉、靜態(tài)導(dǎo)入、自動拆裝箱、增強for循環(huán)、可變參數(shù)
- 詳解Java中l(wèi)ist,set,map的遍歷與增強for循環(huán)
- 淺談java 增強型的for循環(huán) for each
- Java中增強for循環(huán)在一維數(shù)組和二維數(shù)組中的使用方法
- java增強for循環(huán)的實現(xiàn)方法
相關(guān)文章
Java中StringBuilder字符串類型的操作方法及API整理
Java中的StringBuffer類繼承于AbstractStringBuilder,用來創(chuàng)建非線程安全的字符串類型對象,下面即是對Java中StringBuilder字符串類型的操作方法及API整理2016-05-05淺談java中Math.random()與java.util.random()的區(qū)別
下面小編就為大家?guī)硪黄獪\談java中Math.random()與java.util.random()的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09mybatis動態(tài)sql之Map參數(shù)的講解
今天小編就為大家分享一篇關(guān)于mybatis動態(tài)sql之Map參數(shù)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03mybatis-plus之如何實現(xiàn)in嵌套sql
這篇文章主要介紹了mybatis-plus之如何實現(xiàn)in嵌套sql問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03spring cloud gateway 如何修改請求路徑Path
這篇文章主要介紹了spring cloud gateway 修改請求路徑Path的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java數(shù)據(jù)結(jié)構(gòu)之簡單鏈表的定義與實現(xiàn)方法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之簡單鏈表的定義與實現(xiàn)方法,簡單描述了鏈接的概念、原理,并結(jié)合實例形式分析了java定義與使用鏈表的相關(guān)步驟與操作技巧,需要的朋友可以參考下2017-10-10Assert.assertNotNull()斷言是否是空問題
這篇文章主要介紹了Assert.assertNotNull()斷言是否是空問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10