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)文章
spring-boot使用Admin監(jiān)控應(yīng)用的方法
本篇文章主要介紹了spring-boot使用Admin監(jiān)控應(yīng)用的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
java父子節(jié)點(diǎn)parentid樹形結(jié)構(gòu)數(shù)據(jù)的規(guī)整
這篇文章主要介紹了java父子節(jié)點(diǎn)parentid樹形結(jié)構(gòu)數(shù)據(jù)的規(guī)整,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
spring 中事務(wù)注解@Transactional與trycatch的使用
這篇文章主要介紹了spring 中事務(wù)注解@Transactional與trycatch的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot處理form-data表單接收對(duì)象數(shù)組的方法
form-data則是一種更加靈活的編碼方式,它可以處理二進(jìn)制數(shù)據(jù)(如圖片、文件等)以及文本數(shù)據(jù),這篇文章主要介紹了SpringBoot處理form-data表單接收對(duì)象數(shù)組,需要的朋友可以參考下2023-11-11
解決@Scheduled定時(shí)器使用@Thransactional事物問題
這篇文章主要介紹了解決@Scheduled定時(shí)器使用@Thransactional事物問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
ssm框架Springmvc文件上傳實(shí)現(xiàn)代碼詳解
這篇文章主要介紹了ssm框架Springmvc文件上傳實(shí)現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
SpringBoot 在測(cè)試時(shí)如何指定包的掃描范圍
這篇文章主要介紹了SpringBoot 在測(cè)試時(shí)如何指定包的掃描范圍,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Springboot整合freemarker 404問題解決方案
這篇文章主要介紹了Springboot整合freemarker 404問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
IDEA?一直scanning?files?to?index的四種完美解決方法(VIP典藏版)
這篇文章主要介紹了IDEA?一直scanning?files?to?index的四種完美解決方法(VIP典藏版),推薦第四種方法,第四種方法摸索研究后得出,親測(cè)好用,需要的朋友參考下吧2023-10-10

