欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java for循環(huán)和foreach循環(huán)的性能對比分析

 更新時間:2021年09月27日 09:19:53   作者:小草mlc  
這篇文章主要介紹了Java for循環(huán)和foreach循環(huán)的性能對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

for循環(huán)和foreach循環(huán)的性能對比

在公司codereview過程中,發(fā)現(xiàn)一個問題,就是有些人循環(huán)用的是普通for循環(huán),有些人用的是foreach循環(huán),它們之間有什么區(qū)別?應該在什么時候使用這兩種循環(huán)了?

兩種循環(huán)的語法格式:

普通for循環(huán)語法

for (int i = 0; i < integers.length; i++) {
    System.out.println(intergers[i]);
}

foreach 循環(huán)語法

for(Integer in : integers){
    System.out.println(in);
}

今天我們來比較一下兩種for循環(huán)對ArrayList和LinkList集合的循環(huán)性能比較。首先簡單的了解一下ArrayList和LinkList的區(qū)別:

  • ArrayList:ArrayList是采用數組的形式保存對象的,這種方式將對象放在連續(xù)的內存塊中,所以插入和刪除時比較麻煩,查詢比較方便。
  • LinkList:LinkList是將對象放在獨立的空間中,而且每個空間中還保存下一個空間的索引,也就是數據結構中的鏈表結構,插入和刪除比較方便,但是查找很麻煩,要從第一個開始遍歷。

下面是我測試的代碼:

public class Main { 
 public static void main(String[] args){
  //實例化arrayList
  List<Integer> arrayList = new ArrayList<Integer>();
  //實例化linkList
  List<Integer> linkList = new LinkedList<Integer>();
 
  //插入10萬條數據
  for (int i = 0; i < 100000; i++) {
   arrayList.add(i);
   linkList.add(i);
  }
  
  int array = 0;
  //用for循環(huán)arrayList
  long arrayForStartTime = System.currentTimeMillis();
  for (int i = 0; i < arrayList.size(); i++) {
   array = arrayList.get(i);
  }
  long arrayForEndTime = System.currentTimeMillis();
  System.out.println("用for循環(huán)arrayList 10萬次花費時間:" + (arrayForEndTime - arrayForStartTime) + "毫秒");
  
  //用foreach循環(huán)arrayList
  long arrayForeachStartTime = System.currentTimeMillis();
  for(Integer in : arrayList){
   array = in;
  }
  long arrayForeachEndTime = System.currentTimeMillis();
  System.out.println("用foreach循環(huán)arrayList 10萬次花費時間:" + (arrayForeachEndTime - arrayForeachStartTime ) + "毫秒");
  
  //用for循環(huán)linkList
  long linkForStartTime = System.currentTimeMillis();
  int link = 0;
  for (int i = 0; i < linkList.size(); i++) {
   link = linkList.get(i);
  }
  long linkForEndTime = System.currentTimeMillis();
  System.out.println("用for循環(huán)linkList 10萬次花費時間:" + (linkForEndTime - linkForStartTime) + "毫秒");
  
  //用froeach循環(huán)linkList
  long linkForeachStartTime = System.currentTimeMillis();
  for(Integer in : linkList){
   link = in;
  }
  long linkForeachEndTime = System.currentTimeMillis();
  System.out.println("用foreach循環(huán)linkList 10萬次花費時間:" + (linkForeachEndTime - linkForeachStartTime ) + "毫秒");
 }
}

循環(huán)10萬次的時候,控制臺打印結果:

用for循環(huán)arrayList 10萬次花費時間:5毫秒

用foreach循環(huán)arrayList 10萬次花費時間:7毫秒

用for循環(huán)linkList 10萬次花費時間:4481毫秒

用foreach循環(huán)linkList 10萬次花費時間:5毫秒

可以看出,循環(huán)ArrayList時,普通for循環(huán)比foreach循環(huán)花費的時間要少一點;循環(huán)LinkList時,普通for循環(huán)比foreach循環(huán)花費的時間要多很多。

當我將循環(huán)次數提升到一百萬次的時候,循環(huán)ArrayList,普通for循環(huán)還是比foreach要快一點;但是普通for循環(huán)在循環(huán)LinkList時,程序直接卡死。

結論:需要循環(huán)數組結構的數據時,建議使用普通for循環(huán),因為for循環(huán)采用下標訪問,對于數組結構的數據來說,采用下標訪問比較好。

需要循環(huán)鏈表結構的數據時,一定不要使用普通for循環(huán),這種做法很糟糕,數據量大的時候有可能會導致系統(tǒng)崩潰。

for與foreach循環(huán)效率比較

對于數組來說

for循環(huán)略慢foreach

對于鏈表來說

for循環(huán)比foreach慢很多。因為for循環(huán)每次獲取鏈表節(jié)點都要重頭開始查找,而foreach是采用迭代方式,查找節(jié)點只需遍歷一次,節(jié)省了很多時間。

小結一下吧

在循環(huán)操作中不涉及插入、刪除等行為時,優(yōu)先使用foreach

在循環(huán)操作中涉及插入、刪除等破壞數組或鏈表原始映像行為時,應使用for

坊間傳聞,foreach的效率要比for的效率快8倍左右

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java 實現(xiàn)DES 加密解密的示例

    java 實現(xiàn)DES 加密解密的示例

    這篇文章主要介紹了java 實現(xiàn)DES 加密解密的示例代碼,幫助大家更好的理解和使用Java進行加解密,感興趣的朋友可以了解下
    2020-12-12
  • Java模擬實現(xiàn)機場過安檢處理流程

    Java模擬實現(xiàn)機場過安檢處理流程

    這篇文章主要為大家詳細介紹了用Java模擬實現(xiàn)機場安全檢查流程的案例,涉及線程的相關知識,由子線程不斷的檢查通過旅客,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringCloud灰度發(fā)布的設計與實現(xiàn)詳解

    SpringCloud灰度發(fā)布的設計與實現(xiàn)詳解

    這篇文章主要介紹了SpringCloud灰度發(fā)布的設計與實現(xiàn)詳解,灰度從字面意思理解就是存在于黑與白之間的一個平滑過渡的區(qū)域,所以說對于互聯(lián)網產品來說,上線和未上線就是黑與白之分,而實現(xiàn)未上線功能平穩(wěn)過渡的一種方式就叫做灰度發(fā)布,需要的朋友可以參考下
    2023-09-09
  • Java中BigDecimal的基本運算(詳解)

    Java中BigDecimal的基本運算(詳解)

    下面小編就為大家?guī)硪黄狫ava中BigDecimal的基本運算(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Opencv實現(xiàn)身份證OCR識別的示例詳解

    Opencv實現(xiàn)身份證OCR識別的示例詳解

    這篇文章主要為大家詳細介紹了如何使用Opencv實現(xiàn)身份證OCR識別功能,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起了解一下
    2024-03-03
  • RabbitMQ冪等性與優(yōu)先級及惰性詳細全面講解

    RabbitMQ冪等性與優(yōu)先級及惰性詳細全面講解

    關于MQ消費者的冪等性問題,在于MQ的重試機制,因為網絡原因或客戶端延遲消費導致重復消費。使用MQ重試機制需要注意的事項以及如何解決消費者冪等性與優(yōu)先級及惰性問題以下將逐一講解
    2022-11-11
  • Java攔截器Interceptor實現(xiàn)原理及代碼示例

    Java攔截器Interceptor實現(xiàn)原理及代碼示例

    本文詳細講解了Java攔截器Interceptor實現(xiàn)原理及代碼示例,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 解決在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設置了)

    解決在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設置了)

    這篇文章主要介紹了在Idea 2020.2下使用 Lombok的注解不生效的問題(插件安裝了,依賴也寫了,自動注解也設置了),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 使用迭代器模式來進行Java的設計模式編程

    使用迭代器模式來進行Java的設計模式編程

    這篇文章主要介紹了使用迭代器模式來進行Java的設計模式編程,文中對迭代器模式中的容器封裝方面的知識進行了講解,需要的朋友可以參考下
    2016-02-02
  • Java細數IO流底層原理到方法使用

    Java細數IO流底層原理到方法使用

    IO主要用于設備之間的數據傳輸,Java將操作數據流的功能封裝到了IO包中,這篇文章主要給大家介紹了關于Java新手學習之IO流簡單使用的相關資料,需要的朋友可以參考下
    2022-05-05

最新評論