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

