Java中的for循環(huán)高級(jí)用法
前言
作為Java程序中最常用的控制結(jié)構(gòu)之一,for循環(huán)承擔(dān)著80%以上的遍歷操作。本文將全面剖析Java中各類for循環(huán)的實(shí)現(xiàn)原理、使用場(chǎng)景和性能差異,涵蓋傳統(tǒng)for循環(huán)、增強(qiáng)型for循環(huán)、Stream API和并行流等用法,并通過大量代碼示例展示實(shí)際開發(fā)中的最佳實(shí)踐。
一、基礎(chǔ)篇:傳統(tǒng)for循環(huán)
1.1 標(biāo)準(zhǔn)語法結(jié)構(gòu)
for (初始化表達(dá)式; 循環(huán)條件; 迭代語句) { // 循環(huán)體 }
1.2 典型應(yīng)用場(chǎng)景
遍歷數(shù)組
int[] numbers = {1, 2, 3, 4, 5}; for (int i = 0; i < numbers.length; i++) { System.out.println("索引:" + i + " 值:" + numbers[i]); }
嵌套循環(huán)(打印乘法表)
for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(j + "×" + i + "=" + (i*j) + "\t"); } System.out.println(); }
控制迭代方向(逆序遍歷)
for (int i = arr.length - 1; i >= 0; i--) { System.out.println(arr[i]); }
二、進(jìn)階篇:增強(qiáng)型for循環(huán)
2.1 語法糖的本質(zhì)
for (元素類型 變量名 : 可迭代對(duì)象) { // 循環(huán)體 }
2.2 適用場(chǎng)景分析
遍歷集合類
List<String> fruits = Arrays.asList("Apple", "Banana", "Orange"); for (String fruit : fruits) { System.out.println(fruit); }
遍歷Map(需轉(zhuǎn)換為EntrySet)
Map<Integer, String> map = new HashMap<>(); map.put(1, "Java"); map.put(2, "Python"); for (Map.Entry<Integer, String> entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); }
2.3 注意事項(xiàng)
- 不可修改集合結(jié)構(gòu):增強(qiáng)型循環(huán)中直接刪除元素會(huì)拋出
ConcurrentModificationException
- 性能對(duì)比:ArrayList遍歷與傳統(tǒng)for循環(huán)效率相當(dāng),LinkedList建議使用迭代器
三、函數(shù)式編程:Stream API的forEach
3.1 Lambda表達(dá)式遍歷
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 基礎(chǔ)用法 numbers.forEach(n -> System.out.println(n)); // 方法引用優(yōu)化 numbers.forEach(System.out::println);
3.2 帶索引的遍歷方案
IntStream.range(0, numbers.size()) .forEach(i -> System.out.println("索引:" + i + " 值:" + numbers.get(i)));
3.3 并行流遍歷
numbers.parallelStream() .forEach(n -> System.out.println(Thread.currentThread().getName() + ": " + n));
四、性能深度對(duì)比(基于JMH基準(zhǔn)測(cè)試)
4.1 測(cè)試環(huán)境
- JDK 17
- 測(cè)試數(shù)據(jù):ArrayList與LinkedList各包含100,000元素
- 測(cè)試工具:JMH(Java Microbenchmark Harness)
4.2 測(cè)試結(jié)果
遍歷方式 | ArrayList耗時(shí)(ns/op) | LinkedList耗時(shí)(ns/op) |
---|---|---|
傳統(tǒng)for循環(huán) | 2,345 | 12,458,700 |
增強(qiáng)型for循環(huán) | 2,367 | 12,432,900 |
forEach + Lambda | 2,891 | 12,523,400 |
并行流 | 3,215(4線程) | 不推薦使用 |
4.3 關(guān)鍵結(jié)論
- 數(shù)組結(jié)構(gòu):傳統(tǒng)for循環(huán)效率最高(直接通過索引訪問)
- 鏈表結(jié)構(gòu):應(yīng)當(dāng)優(yōu)先使用迭代器(避免頻繁的get()操作)
- 并行流:僅在數(shù)據(jù)量極大(百萬級(jí))且無順序要求時(shí)適用
五、特殊場(chǎng)景處理技巧
5.1 循環(huán)中斷控制
// break跳出整個(gè)循環(huán) for (int i = 0; i < 10; i++) { if (i == 5) break; System.out.println(i); } // continue跳過當(dāng)前迭代 for (int i = 0; i < 10; i++) { if (i % 2 == 0) continue; System.out.println(i + "是奇數(shù)"); }
5.2 無限循環(huán)實(shí)現(xiàn)
// 標(biāo)準(zhǔn)寫法 for (;;) { // 需要明確的退出條件 if (exitCondition) break; } // while等效形式 while (true) { // 循環(huán)體 }
5.3 多變量控制
for (int i = 0, j = 10; i < j; i++, j--) { System.out.println("i=" + i + " j=" + j); }
六、最佳實(shí)踐與避坑指南
6.1 循環(huán)優(yōu)化策略
減少循環(huán)內(nèi)計(jì)算:將固定值提到循環(huán)外部
// 錯(cuò)誤示例 for (int i = 0; i < list.size(); i++) {...} // 優(yōu)化后 int size = list.size(); for (int i = 0; i < size; i++) {...}
避免頻繁裝箱拆箱:優(yōu)先使用基本類型數(shù)組
// 低效 List<Integer> list = new ArrayList<>(); // 高效 int[] array = new int[100];
6.2 常見錯(cuò)誤案例
修改循環(huán)變量
for (int i = 0; i < 10; i++) { i = i + 2; // 導(dǎo)致不可預(yù)測(cè)的循環(huán)次數(shù) }
并發(fā)修改異常
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C")); for (String s : list) { if (s.equals("B")) { list.remove(s); // 拋出ConcurrentModificationException } }
七、總結(jié)與擴(kuò)展
7.1 循環(huán)方式選擇矩陣
場(chǎng)景 | 推薦方式 |
---|---|
數(shù)組遍歷 | 傳統(tǒng)for循環(huán) |
集合順序訪問 | 增強(qiáng)型for循環(huán) |
函數(shù)式處理 | Stream forEach |
復(fù)雜條件控制 | 傳統(tǒng)for循環(huán) |
大數(shù)據(jù)量并行處理 | 并行流 |
7.2 未來發(fā)展方向
Record模式匹配(Java 21預(yù)覽特性):
for (Point(var x, var y) : points) { System.out.println(x + ", " + y); }
協(xié)程支持(Loom項(xiàng)目):
// 虛擬線程中的循環(huán)控制 Thread.startVirtualThread(() -> { for (int i = 0; i < 100; i++) { // 輕量級(jí)線程中的循環(huán) } });
到此這篇關(guān)于Java中的for循環(huán):從基礎(chǔ)到高階用法的文章就介紹到這了,更多相關(guān)Java for循環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成gRPC微服務(wù)工程搭建實(shí)踐的方法
這篇文章主要介紹了SpringBoot集成gRPC微服務(wù)工程搭建實(shí)踐的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01Java操作MongoDB數(shù)據(jù)庫的示例代碼
這篇文章主要介紹了Java操作MongoDB的示例代碼,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-04-04Java獲取兩個(gè)集合List的交集、補(bǔ)集、并集(相加)和差集(相減)的幾種方式
這篇文章主要介紹了Java獲取兩個(gè)集合List的交集、補(bǔ)集、并集(相加)和差集(相減)的幾種方式,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2025-04-04Spring Boot 簡(jiǎn)單使用EhCache緩存框架的方法
本篇文章主要介紹了Spring Boot 簡(jiǎn)單使用EhCache緩存框架的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07Hibernate對(duì)數(shù)據(jù)庫刪除、查找、更新操作實(shí)例代碼
本篇文章主要介紹了Hibernate對(duì)數(shù)據(jù)庫刪除、查找、更新操作實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05SpringCloud?服務(wù)注冊(cè)中的nacos實(shí)現(xiàn)過程
這篇文章主要介紹了SpringCloud?服務(wù)注冊(cè)之nacos實(shí)現(xiàn)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03java面向國(guó)際化項(xiàng)目開發(fā)需遵循的命名規(guī)范
這篇文章主要為大家介紹了在參與開發(fā)國(guó)際化項(xiàng)目時(shí)需遵循的java命名規(guī)范,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03