1、傳統(tǒng)for循環(huán)
傳統(tǒng)的for循環(huán)是一種經(jīng)典的循環(huán)結構,在Java中廣泛使用。
以下是傳統(tǒng)for循環(huán)的特點:
靈活控制:傳統(tǒng)for循環(huán)使用形式為for (初始化表達式; 終止條件; 步進表達式)的語法,可以手動控制循環(huán)的索引,并根據(jù)需要執(zhí)行自定義操作。
索引訪問:傳統(tǒng)for循環(huán)通過索引訪問集合或數(shù)組中的元素,可以直接讀取和修改元素的值。
例如:
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i)); // 讀取元素的屬性值或執(zhí)行操作是允許的
numbers.set(i, 10); // 直接修改元素的值是允許的
}
}
}
底層操作:相比增強型for循環(huán),傳統(tǒng)for循環(huán)提供了更底層的操作,更加靈活,但也更加繁瑣。
適用對象:適用于任何實現(xiàn)了Iterable或Iterator接口的集合類。
示例代碼:
public class Demo {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
}
}
傳統(tǒng)for循環(huán)代碼結構是這樣的:
for(循環(huán)變量的初始聲明;循環(huán)的判定條件;改變循環(huán)變量的條件){
循環(huán)體
}
其中執(zhí)行順序是:①循環(huán)變量的初始聲明(聲明循環(huán)變量) ②循環(huán)的判斷條件(判定是否繼續(xù)執(zhí)行循環(huán),是boolean值) ③循環(huán)體(想要重復執(zhí)行的代碼段) ④改變循環(huán)變量的條件(用于結束循環(huán)) ⑤再回到2中判斷是否跳出循環(huán),如果判斷結果是true,繼續(xù)上述過程。如果判斷結果是false,則跳出整個循環(huán)代碼段,執(zhí)行后續(xù)代碼。
如測試通過遍歷方式,實現(xiàn)為數(shù)組賦值,賦值為100,200,300,400,500
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
int[] arr = new int[5];
int num = 100;
for (int i = 0; i < arr.length; i++) {
arr[i] = num;
num += 100;
}
System.out.println(Arrays.toString(arr));
}
}
代碼的輸出結果是這樣的:[100, 200, 300, 400, 500]
顯而易見,普通for循環(huán)通過下標索引,將值賦值到了數(shù)組內部。
2、增強型for循環(huán)
增強型for循環(huán),也稱為foreach循環(huán),是一種簡化版的循環(huán)語法。它可以用于遍歷數(shù)組或實現(xiàn)了Iterable接口的集合類。
以下是增強型for循環(huán)的特點:
語法簡潔:增強型for循環(huán)使用形式為for (元素類型 元素變量 : 集合或數(shù)組)的語法,使代碼更易讀和編寫。
只讀訪問:在每次迭代中,增強型for循環(huán)提供對當前元素的只讀訪問權限,不能直接修改元素的值。
例如:
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
System.out.println(list);
for (String s : list) {
s = "New Value"; // 嘗試修改元素的值
}
System.out.println(list);
}
}
?
適用對象:適用于數(shù)組或實現(xiàn)了Iterable接口的集合類。
示例代碼:
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Orange");
for (String fruit : list) {
System.out.println(fruit);
}
}
}
?
增強型for循環(huán)代碼結構是這樣的:
for(接收數(shù)組元素的類型 變量名:數(shù)組){
變量名代表數(shù)組中的每一個數(shù)據(jù)
}
增強for可以遍歷數(shù)組中的每一個元素,用前面的變量名來接收。我強調一下是接收,因為類型所定義的變量只是用來接收數(shù)組中各個元素,而不是將每個元素分離出來。
列如上面問題,測試通過2種遍歷方式,分別實現(xiàn)為數(shù)組賦值,賦值為100,200,300,400,500
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
int[] arr = new int[5];
int num = 100;
for (int i : arr) {
i = num;
num += 100;
}
System.out.println(Arrays.toString(arr));
}
}
代碼輸出結果是這樣的:[0, 0, 0, 0, 0]
也就是說增強for循環(huán)根本沒有將值傳到數(shù)組內部。這也是普通for與增強for的區(qū)別,普通for循環(huán)可以實現(xiàn)為數(shù)組賦值,根據(jù)索引操作;foreach只能遍歷獲取,不能修改數(shù)組中的數(shù)據(jù)。
除此之外,:前面是接收數(shù)組元素的類型,這里強調的是,這里定義的類型是接受數(shù)組元素的類型,不必是數(shù)組的類型關系。
for(long|float|double|.. i:arr){
i=num;
num+=100;
}
其實類型沒有那么嚴格,只要是能接收這個int型的數(shù)組arr的元素即可。當然不能接收的其他類型,比如byte,short ,char…就會報錯。
?
3、forEach循環(huán)
forEach是Java 8中引入的一個方法,用于遍歷集合中的元素并對其執(zhí)行某種操作。它可以接受一個函數(shù)作為參數(shù),這個函數(shù)會對集合中的每個元素進行操作。這個函數(shù)可以是Lambda表達式,也可以是一個普通的函數(shù)接口。
Lambda表達式在Java 8中被引入,是一種簡潔,函數(shù)式的方法來編寫某些操作。Lambda表達式主要被用于創(chuàng)建只有一個方法的接口,這個接口可以包含一個參數(shù)列表和一個表達式或一個塊語句。這種表達式或塊語句就是Lambda體。
以下是Lambda表達式for循環(huán)的特點:
函數(shù)式風格:Lambda表達式for循環(huán)采用函數(shù)式編程風格,通過Lambda表達式定義循環(huán)體的操作,使代碼更加簡潔和易讀。
自動迭代:與增強型for循環(huán)類似,Lambda表達式for循環(huán)自動迭代集合或數(shù)組中的元素,無需手動控制索引。
例如:
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
// 使用Java 8的forEach和Lambda表達式
list.forEach(fruit -> System.out.println(fruit));
}
}
4、效率簡單對比
說明:測試可能有不嚴謹?shù)牡胤?時間,機器,執(zhí)行順序,cpu運行后效率降低也有可能,僅供參考
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
long[] numbers = {10000L, 100000L, 1000000L, 10000000L};
for (int j= 0; j < numbers.length; j++) {
long times = numbers[j];
System.out.println("操作次數(shù):" + times);
List<String> list = new ArrayList<>();
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
for (int i = 0; i < times; i++) {
list.add(new String());
}
long startTime = System.currentTimeMillis();
//普通for
for (int i = 0; i < list.size(); i++) {
list1.add(list.get(i));
}
long endTime = System.currentTimeMillis();
System.out.println("普通for時間(毫秒):" + (endTime - startTime));
//增強for
long startTime1 = System.currentTimeMillis();
for (String s : list) {
list2.add(s);
}
long endTime1 = System.currentTimeMillis();
System.out.println("增強for時間(毫秒):" + (endTime1 - startTime1));
long startTime2 = System.currentTimeMillis();
//forEach
list.forEach(s -> list3.add(s));
long endTime2 = System.currentTimeMillis();
System.out.println("forEach時間(毫秒):" + (endTime2 - startTime2));
}
}
}
執(zhí)行結果:
操作次數(shù):10000
普通for時間(毫秒):1
增強for時間(毫秒):1
forEach時間(毫秒):59
操作次數(shù):100000
普通for時間(毫秒):2
增強for時間(毫秒):2
forEach時間(毫秒):3
操作次數(shù):1000000
普通for時間(毫秒):37
增強for時間(毫秒):10
forEach時間(毫秒):8
操作次數(shù):10000000
普通for時間(毫秒):203
增強for時間(毫秒):170
forEach時間(毫秒):184
5、適用場景的選擇
選擇合適的循環(huán)方式取決于具體的需求和操作。以下是一些建議的使用場景:
傳統(tǒng)for循環(huán):適用于需要手動控制索引、執(zhí)行自定義操作或修改集合或數(shù)組元素值的場景。
增強型for循環(huán):適用于簡單的遍歷和只讀操作,不需要修改集合或數(shù)組的元素。
Lambda表達式+forEach循環(huán):適用于函數(shù)式編程風格,簡化代碼,并且無需手動控制索引的場景。文章來源:http://www.zghlxwxcb.cn/news/detail-731007.html
根據(jù)具體的需求,我們可以靈活選擇不同的循環(huán)方式,以實現(xiàn)代碼的簡潔、可讀性和性能的平衡。文章來源地址http://www.zghlxwxcb.cn/news/detail-731007.html
到了這里,關于Java循環(huán)對比:傳統(tǒng)for循環(huán)、增強型for循環(huán)和forEach循環(huán)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!