最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ū)別?應(yīng)該在什么時候使用這兩種循環(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是采用數(shù)組的形式保存對象的,這種方式將對象放在連續(xù)的內(nèi)存塊中,所以插入和刪除時比較麻煩,查詢比較方便。
  • LinkList:LinkList是將對象放在獨立的空間中,而且每個空間中還保存下一個空間的索引,也就是數(shù)據(jù)結(jié)構(gòu)中的鏈表結(jié)構(gòu),插入和刪除比較方便,但是查找很麻煩,要從第一個開始遍歷。

下面是我測試的代碼:

public class Main { 
 public static void main(String[] args){
  //實例化arrayList
  List<Integer> arrayList = new ArrayList<Integer>();
  //實例化linkList
  List<Integer> linkList = new LinkedList<Integer>();
 
  //插入10萬條數(shù)據(jù)
  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萬次的時候,控制臺打印結(jié)果:

用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)花費的時間要多很多。

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

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

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

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

對于數(shù)組來說

for循環(huán)略慢foreach

對于鏈表來說

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

小結(jié)一下吧

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

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

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

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

相關(guān)文章

  • java8新特性之Optional的深入解析

    java8新特性之Optional的深入解析

    這篇文章主要給大家介紹了關(guān)于java8新特性之Optional的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Java 如何使用@Autowired注解自動注入bean

    Java 如何使用@Autowired注解自動注入bean

    這篇文章主要介紹了Java 使用@Autowired注解自動注入bean的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringMVC開發(fā)restful API之用戶查詢代碼詳解

    SpringMVC開發(fā)restful API之用戶查詢代碼詳解

    這篇文章主要介紹了SpringMVC開發(fā)restful API之用戶查詢代碼詳解,小編覺得挺不錯的,這里分享給大家,需要的朋友可以參考。下面隨小編一起看看吧。
    2017-11-11
  • MyBatisCodeHelperPro插件下載及使用教程詳解

    MyBatisCodeHelperPro插件下載及使用教程詳解

    這篇文章主要介紹了MyBatis CodeHelperPro插件使用教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • SpringCloud+Tornado基于jwt實現(xiàn)請求安全校驗功能

    SpringCloud+Tornado基于jwt實現(xiàn)請求安全校驗功能

    這篇文章主要介紹了SpringCloud+Tornado基于jwt實現(xiàn)請求安全校驗,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • java并發(fā)編程專題(五)----詳解(JUC)ReentrantLock

    java并發(fā)編程專題(五)----詳解(JUC)ReentrantLock

    這篇文章主要介紹了java(JUC)ReentrantLock的的相關(guān)資料,文中講解非常詳細,實例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 淺談java獲取服務(wù)器基本信息

    淺談java獲取服務(wù)器基本信息

    這篇文章主要介紹了java獲取服務(wù)器基本信息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java 中使用數(shù)組存儲和操作數(shù)據(jù)

    Java 中使用數(shù)組存儲和操作數(shù)據(jù)

    本文將介紹Java中常用的數(shù)組操作方法,通過詳細的示例和解釋,幫助讀者全面理解和掌握這些方法,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • @Configuration與@Component作為配置類的區(qū)別詳解

    @Configuration與@Component作為配置類的區(qū)別詳解

    這篇文章主要介紹了@Configuration與@Component作為配置類的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Spring Boot配置application.yml及根據(jù)application.yml選擇啟動配置的操作方法

    Spring Boot配置application.yml及根據(jù)application.yml選擇啟動配置的操作

    Spring Boot中可以選擇applicant.properties 作為配置文件,也可以通過在application.yml中進行配置,讓Spring Boot根據(jù)你的選擇進行加載啟動配置文件,本文給大家介紹Spring Boot配置application.yml及根據(jù)application.yml選擇啟動配置的操作方法,感興趣的朋友一起看看吧
    2023-10-10

最新評論

东乡族自治县| 陕西省| 黑河市| 维西| 进贤县| 双柏县| 马公市| 开化县| 简阳市| 买车| 祁门县| 大理市| 塔城市| 白山市| 蒙城县| 潜江市| 饶平县| 黄大仙区| 灵石县| 卢龙县| 华阴市| 本溪市| 桦南县| 康保县| 西贡区| 西和县| 哈密市| 巍山| 萨嘎县| 商洛市| 商城县| 安远县| 江华| 静安区| 元谋县| 兴山县| 昌乐县| 陕西省| 龙泉市| 德阳市| 宣化县|