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

Java優(yōu)化for循環(huán)嵌套的高效率方法

 更新時間:2020年09月14日 15:13:45   作者:laosun  
這篇文章主要介紹了Java優(yōu)化for循環(huán)嵌套的高效率方法,幫助大家更好的提升java程序性能,感興趣的朋友可以了解下

前幾天有人問過我一個問題,就是兩個嵌套for循環(huán)執(zhí)行效率的問題,問有什么好的辦法替換。當時我想了想,實在想不起來,哎,慚愧?。?! 請教了答案,恍然大悟。

比如:兩個list中分別裝有相同的對象數(shù)據(jù)。 list1中有3萬條對象數(shù)據(jù)。 list2中有2萬條對象數(shù)據(jù)(但是對象中的某個屬性變量為空)。兩個list中的id或者其他變量都一模一樣。請用最快的方式找出list2中變量為空的那個對象,并且去list1中找出id相同的對象。 或者可以理解成,從list2中找出變量為空的,去list1中找出對應(yīng)的對象,然后把為空的列補上。總之就是這么一個意思,先 for 循環(huán) list2,判斷一下每個對象的那個屬性變量是否為空,如果為空,再去for循環(huán)list1,找出id一樣的對象,就算執(zhí)行成功了。

那么請看下邊的for循環(huán)嵌套的解決方式:

for(Member m2:list2){
 if(m2.getName()==null){
 for(Member m1:list1){
  if(m1.getId().intValue()==m2.getId().intValue()){
  System.out.println(m2.getId()+" Name 值為空!!!");
  }
 }
 }
}

這樣真的好嗎? 如果有上萬,甚至十幾萬的數(shù)據(jù),那么這個執(zhí)行效率問題,我就不多說了。 非常非常的慢。

下邊來看使用map代替的執(zhí)行方式,以及兩種方式的效率對比:

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
 
class Member {
 private Integer id;
 private String name;
 private Integer age;
 private Date addDate;
 
 public Member() {
 }
 
 public Member(Integer id, String name, Integer age, Date addDate) {
 super();
 this.id = id;
 this.name = name;
 this.age = age;
 this.addDate = addDate;
 }
 
 public Integer getId() {
 return id;
 }
 
 public void setId(Integer id) {
 this.id = id;
 }
 
 public String getName() {
 return name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
 
 public Integer getAge() {
 return age;
 }
 
 public void setAge(Integer age) {
 this.age = age;
 }
 
 public Date getAddDate() {
 return addDate;
 }
 
 public void setAddDate(Date addDate) {
 this.addDate = addDate;
 }
 
}
 
public class For2 {
 
 public static void main(String[] args) throws InterruptedException {
 List<Member> list1 = new ArrayList<>();
 List<Member> list2 = new ArrayList<>();
 for(int i=0;i<30000;i++){
  Date date = new Date();
  list1.add(new Member((i+1),"技術(shù)客",(i+1), date));
  if(i%2==0){
  list2.add(new Member((i+1),null,(i+1), date));
  }
 }
  
 //雙for循環(huán)嵌套測試
 long s1 = System.currentTimeMillis();
 int forNumber = 0;
 for(Member m2:list2){
  if(m2.getName()==null){
  for(Member m1:list1){
   if(m1.getId().intValue()==m2.getId().intValue()){
//   System.out.println(m2.getId()+" Name 值為空!!!");
   forNumber++;
   }
  }
  }
 }
 long s2 = System.currentTimeMillis();
 System.out.println("雙for循環(huán)查詢時間為:"+(s2-s1)+"(毫秒),一共查詢出"+forNumber+"條數(shù)據(jù) \n\n\n");
 TimeUnit.SECONDS.sleep(3);
  
 //map查詢測試
 long s3 = System.currentTimeMillis();
  
 int mapNumber = 0;
 Map<Integer, Member> map = new HashMap<>();
 for(Member m1:list1){
  map.put(m1.getId(), m1);
 }
 for(Member m2:list2){
  if(m2.getName()==null){
  Member m = map.get(m2.getId());
  if(m!=null){
//   System.out.println(m2.getId()+" Name 值為空!!!");
   mapNumber++;
  }
  }
 }
 long s4 = System.currentTimeMillis();
 System.out.println("使用map結(jié)構(gòu)查詢時間為:"+(s4-s3)+"(毫秒),一共查詢出"+mapNumber+"條數(shù)據(jù) \n\n\n");
 }
 
}

輸出結(jié)果:

雙for循環(huán)查詢時間為:1578(毫秒),一共查詢出15000條數(shù)據(jù)



使用map結(jié)構(gòu)查詢時間為:14(毫秒),一共查詢出15000條數(shù)據(jù)

如果我們模擬10萬條數(shù)據(jù),然后其中五千條重復數(shù)據(jù)的情況下:效率更是天壤之別。

看輸出結(jié)果:

雙for循環(huán)查詢時間為:30929(毫秒),一共查詢出50000條數(shù)據(jù)



使用map結(jié)構(gòu)查詢時間為:24(毫秒),一共查詢出50000條數(shù)據(jù)

循環(huán)數(shù)據(jù)越小,兩者差別也就越小,但是數(shù)據(jù)量越大,差別也就越大。 10萬條數(shù)據(jù)的差別竟然達到上千倍!

以上就是Java優(yōu)化for循環(huán)嵌套的高效率方法的詳細內(nèi)容,更多關(guān)于Java 優(yōu)化 for循環(huán)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 獲取properties的幾種方式

    Java 獲取properties的幾種方式

    這篇文章主要介紹了Java 獲取properties的幾種方式,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-04-04
  • Java通過HttpClient進行HTTP請求的代碼詳解

    Java通過HttpClient進行HTTP請求的代碼詳解

    Apache?HttpClient是一個功能強大且廣泛使用的Java庫,它提供了方便的方法來執(zhí)行HTTP請求并處理響應(yīng)。本文將介紹如何使用HttpClient庫進行HTTP請求,包括GET請求、POST請求、添加參數(shù)和請求體、設(shè)置請求頭等操作,需要的朋友可以參考下
    2023-05-05
  • 通過java生成讀取二維碼詳解

    通過java生成讀取二維碼詳解

    這篇文章主要介紹了java二維碼生成讀取詳解,二維碼再生活在無處不在,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面和小編一起來學習一下吧
    2019-05-05
  • SpringBoot響應(yīng)Json數(shù)據(jù)亂碼通過配置的解決

    SpringBoot響應(yīng)Json數(shù)據(jù)亂碼通過配置的解決

    這篇文章主要介紹了SpringBoot響應(yīng)Json數(shù)據(jù)亂碼通過配置的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • IO密集型任務(wù)設(shè)置線程池線程數(shù)實現(xiàn)方式

    IO密集型任務(wù)設(shè)置線程池線程數(shù)實現(xiàn)方式

    這篇文章主要介紹了IO密集型任務(wù)設(shè)置線程池線程數(shù)實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 淺析Java中Runnable和Thread的區(qū)別

    淺析Java中Runnable和Thread的區(qū)別

    在java中可有兩種方式實現(xiàn)多線程,一種是繼承Thread類,一種是實現(xiàn)Runnable接口;Thread類是在java.lang包中定義的。接下來通過本文給大家淺析Java中Runnable和Thread的區(qū)別,一起看看吧
    2017-02-02
  • Java Socket實現(xiàn)的傳輸對象功能示例

    Java Socket實現(xiàn)的傳輸對象功能示例

    這篇文章主要介紹了Java Socket實現(xiàn)的傳輸對象功能,結(jié)合具體實例形式分析了java socket傳輸對象的原理及接口、客戶端、服務(wù)器端相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • Java日常練習題,每天進步一點點(4)

    Java日常練習題,每天進步一點點(4)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • 解決Spring Boot項目端口8080被占用的問題

    解決Spring Boot項目端口8080被占用的問題

    這篇文章主要介紹了解決Spring Boot項目端口8080被占用的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java線程中的線程本地變量ThreadLocal詳解

    Java線程中的線程本地變量ThreadLocal詳解

    這篇文章主要介紹了Java線程中的線程本地變量ThreadLocal詳解,ThreadLocal存放的值是線程內(nèi)共享的,線程間互斥的,主要用于線程內(nèi)共享一些數(shù)據(jù),避免通過參數(shù)來傳遞,這樣處理后,能夠優(yōu)雅的解決一些實際問題,需要的朋友可以參考下
    2023-11-11

最新評論