日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
對于Java中的For循環(huán)和Foreach,哪個更快

?Java遍歷集合有兩種方法。一個是最基本的for循環(huán),另一個是jdk5引入的for each。通過這種方法,我們可以更方便地遍歷數(shù)組和集合。但是你有沒有想過這兩種方法?哪一個遍歷集合更有效?

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),普陀企業(yè)網(wǎng)站建設(shè),普陀品牌網(wǎng)站建設(shè),網(wǎng)站定制,普陀網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,普陀網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

for-each實現(xiàn)方法

For-each不是一種新語法,而是Java的語法糖。在編譯時,編譯器將此代碼轉(zhuǎn)換為迭代器實現(xiàn),并將其編譯為字節(jié)碼。

語法糖:

語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個術(shù)語,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。

我們可以通過執(zhí)行命令javap-verbose-Testforeach反編譯以下編譯代碼:

public class TestForeach {
List integers;
public void testForeach(){
for(Integer i : integers){

}
}
}

獲得的詳細(xì)字節(jié)碼如下:

public void testForeach();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: aload_0
1: getfield #2 // Field integers:Ljava/util/List;
4: invokeinterface #3, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
9: astore_1
10: aload_1
11: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
16: ifeq 32
19: aload_1
20: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
25: checkcast #6 // class java/lang/Integer
28: astore_2
29: goto 10
32: return
LineNumberTable:
line 11: 0
line 13: 29
line 14: 32
LocalVariableTable:
Start Length Slot Name Signature
29 0 2 i Ljava/lang/Integer;
0 33 0 this Ltest/TestForeach;
}

此字節(jié)碼的一般含義是使用getfileld命令來獲取integers變量并且調(diào)用List.iterator來獲取迭代器實例和調(diào)用iterator.hasNext。如果返回true,調(diào)用iterator.next方法。

請看,這是迭代器遍歷集合的實現(xiàn)邏輯。

基準(zhǔn)測試

現(xiàn)在讓我們使用for循環(huán)方法和for-each方法進(jìn)行測試。

public class ForLoopTest {

public static void main(String[] args) {
List arrayList = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
arrayList.add(i);
}

long arrayListStartTime = System.currentTimeMillis();
for (int i = 0; i < arrayList.size(); i++) {
arrayList.get(i);
}

long arrayListCost =System.currentTimeMillis()-arrayListStartTime;
System.out.println("ArrayList for loop traversal cost: "+ arrayListCost);

long arrayListForeachStartTime = System.currentTimeMillis();
for (Integer integer : arrayList) {

}

long arrayListForeachCost =System.currentTimeMillis()-arrayListForeachStartTime;
System.out.println("ArrayList foreach traversal cost: "+ arrayListForeachCost);

這是測試結(jié)果:

如你所見,結(jié)果是顯而易見的。對于ArrayList,使用For循環(huán)方法的性能優(yōu)于For each方法。

我們可以說for循環(huán)比for-each好嗎?

答案是否定的。在下一個基準(zhǔn)測試中,我們將ArrayList更改為LinkedList。 同樣,這里是測試結(jié)果。

原因分析

一些初學(xué)者可能想知道為什么ArrayList使用for循環(huán)方法遍歷得更快,而LinkedList則更慢,速度也非常慢?

這由ArrayList和LinkedList數(shù)據(jù)結(jié)構(gòu)決定。 ArrayList底層使用數(shù)組存儲元素。數(shù)組是連續(xù)的內(nèi)存空間。數(shù)據(jù)可以通過索引獲得。時間復(fù)雜度為O(1),因此速度很快。

LinkedList的底層是一個雙向鏈表。使用for循環(huán)實現(xiàn)遍歷,每次都需要從鏈表的頭節(jié)點開始。時間復(fù)雜度為O(n*n)。

結(jié)論

  1. 使用ArrayList時,for循環(huán)方法更快,因為for-each由迭代器實現(xiàn),并且需要執(zhí)行并發(fā)修改驗證。
  2. 使用LinkedList時,for-each比for循環(huán)快得多,因為LinkedList是通過使用雙向鏈表實現(xiàn)的。每個尋址都需要從頭節(jié)點開始。如果我們需要遍歷LinkedList,我們需要避免使用for循環(huán)。
  3. 使用迭代器模式,for-each不需要關(guān)心集合的具體實現(xiàn)。如果需要替換集合,無需修改代碼即可輕松替換。?

新聞名稱:對于Java中的For循環(huán)和Foreach,哪個更快
分享鏈接:http://www.5511xx.com/article/dhegjse.html