国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java】Java中使用HashMap優(yōu)化多層for循環(huán)嵌套以及for循環(huán)之性能優(yōu)化

這篇具有很好參考價值的文章主要介紹了【Java】Java中使用HashMap優(yōu)化多層for循環(huán)嵌套以及for循環(huán)之性能優(yōu)化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

for循環(huán)是開發(fā)時常用的語法之一,比如對數(shù)組,集合的遍歷等,但是如果使用不好也會出現(xiàn)很多新能損耗的問題,今天就來講解一下for循環(huán)的常用性能優(yōu)化問題。

for循環(huán) 里面還有 for循環(huán), 然后做一些數(shù)據(jù)匹配、處理 這種場景。

使用HashMap優(yōu)化多級嵌套循環(huán)

m層嵌套的n次的for循環(huán)的時間復(fù)雜度為O(n^m),如下所示:

優(yōu)化前

public class forTradition {
 public static void main(String[] args){
 
     List<Student> stus = new ArrayList<>();
     //  為stus寫入10條數(shù)據(jù) ... 略
     List<Grade> gs = new ArrayList<>();
     //  為gs寫入10條數(shù)據(jù) ... 略
     
     for (int i = 0 ; i < stus.size() ; i++ ) {
         Student stu = stus.get(i);
         Integer id = stu.getId();
         String stuName = stu.getName();
         for (int j = 0 ; j < gs.size() ; j++ ) {
         	Grade g = gs.get(j);
         	if( id == g.getStuId() ) { 
	            System.out.println( "學(xué)生:" + stuName + ",成績:" + g.getValue() );
         	}
    	 }
 	 }
}

優(yōu)化后

public class forNew {
 public static void main(String[] args){
 
     List<Student> stus = new ArrayList<>();
     //  為stus寫入10條數(shù)據(jù) ... 略
     List<Grade> gs = new ArrayList<>();
	 //  為gs寫入10條數(shù)據(jù) ... 略
	 
	 Map<Integer,Integer> gradesMap = 
	 		gs.stream().collect(Collectors.toMap( data -> data.getStuId() , data -> data.getValue() );
      
     for (int i = 0 ; i < stus.size() ; i++ ) {
         Student stu = stus.get(i);
         Integer value = gradesMap.get(stu.getId());
         if( null != value ) {
         	System.out.println( "學(xué)生:" + stu.getName() + ",成績:" + value );
		 }
	 }
  }
}

for循環(huán)之性能優(yōu)化

嵌套循環(huán)

嵌套循環(huán)是有倆層或者倆層以上的循環(huán)嵌套在一起,下面直接上代碼說明。

外大內(nèi)小嵌套

   /**
     * 大循環(huán)驅(qū)動小循環(huán)(即外大內(nèi)?。?     */
    private static void bigSmall() {
        long stratTime = System.nanoTime();
        for (int i = 0; i < 10000000; i++) {
            for (int j = 0; j < 100; j++) {

            }
        }
        long endTime = System.nanoTime();
        System.out.println("外大內(nèi)小耗時:" + (endTime - stratTime));
    }

執(zhí)行看一下結(jié)果耗時:

外大內(nèi)小耗時:8743800

再看看外小內(nèi)大耗時情況

外小內(nèi)大嵌套

   /**
     * 小循環(huán)驅(qū)動大循環(huán)(即外小內(nèi)大)
     */
    private static void smallBig() {
        long stratTime = System.nanoTime();
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 10000000; j++) {

            }
        }
        long endTime = System.nanoTime();
        System.out.println("外小內(nèi)大耗時:" + (endTime - stratTime));
    }

執(zhí)行看一下結(jié)果耗時:

外小內(nèi)大耗時:6922600

好了,綜合比較一下倆者的執(zhí)行時間,時差還是很大的。

外小內(nèi)大耗時:6922600 ;外大內(nèi)小耗時:8743800

分析總結(jié)

由以上對比可知,優(yōu)化后性能顯著提升。嵌套循環(huán)應(yīng)該遵循“外小內(nèi)大”的原則,雖然循環(huán)次數(shù)沒變,但是耗時卻長了很大。這就好比你復(fù)制很多個小文件和復(fù)制幾個大文件的區(qū)別,雖然總的大小沒變,但是復(fù)制大文件明顯比多個小文件更快。

循環(huán)變量的實例化

把循環(huán)變量的實例放在循環(huán)內(nèi):

/**
 * 循環(huán)變量放在循環(huán)內(nèi)
 */
private static void smallBigBetterTwo() {
    long stratTime = System.nanoTime();
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 10000000; j++) {

        }
    }
    long endTime = System.nanoTime();
    System.out.println("循環(huán)內(nèi)變量耗時:" + (endTime - stratTime));
}

執(zhí)行耗時:

循環(huán)內(nèi)變量耗時:4934500

把循環(huán)變量的實例放在循環(huán)之外:

/**

  • 循環(huán)變量放在循環(huán)外
    */
    private static void smallBigBetter() {
    long stratTime = System.nanoTime();
    int i, j;
    for (i = 0; i < 100; i++) {
    for (j = 0; j < 10000000; j++) {

     }
    

    }
    long endTime = System.nanoTime();
    System.out.println(“循環(huán)外變量耗時:” + (endTime - stratTime));
    }

執(zhí)行耗時:

循環(huán)外變量耗時:5013800

對比一下把變量放在循環(huán)內(nèi)和循環(huán)外對比耗時,發(fā)現(xiàn)時差還是挺大的:

循環(huán)內(nèi)變量耗時:4934500;循環(huán)外變量耗時:5013800

分析總結(jié)

雖然優(yōu)化效果并不明顯,但是隨著循環(huán)次數(shù)的增加,耗時會越來越大,優(yōu)化效果則會越來越明顯。分析:優(yōu)化前需要實例化1+i=101次,優(yōu)化后僅僅2次??偨Y(jié):循環(huán)變量的實例化應(yīng)放在循環(huán)外。

提取與循環(huán)無關(guān)的表達式

沒有提取無關(guān)的表達式

   /**
     * 未提取無關(guān)的表達式
     */
    private static void calculationInner() {
        int a = 3;
        int b = 7;
        long stratTime = System.nanoTime();
        for (int i = 0; i < 10000000; i++) {
            i = i * a * b;
        }
        long endTime = System.nanoTime();
        System.out.println("未提取耗時:" + (endTime - stratTime));

    }

沒有提取耗時:

未提取耗時:800

提取了無關(guān)的表達式

/**
 * 提取無關(guān)的表達式
 */
private static void calculationOuter() {
    int a = 3;
    int b = 7;
    int c = a * b;
    long stratTime = System.nanoTime();
    for (int i = 0; i < 10000000; i++) {
        i = i * c;
    }
    long endTime = System.nanoTime();
    System.out.println("已提取耗時:" + (endTime - stratTime));
}

提取了無關(guān)表達式耗時:

已提取耗時:500

分析總結(jié)

代碼中a*b與循環(huán)無關(guān),所以應(yīng)該把它放到外面,避免重復(fù)計算。從理論角度分析,由于減少了計算次數(shù),故優(yōu)化后性能會更高。

消除循環(huán)終止判斷時的方法調(diào)用

stratTime = System.nanoTime();
for (int i = 0; i < list.size(); i++) { 

}
endTime = System.nanoTime();
System.out.println("未優(yōu)化list耗時:"+(endTime - stratTime));

耗時:

未優(yōu)化list耗時:253800

優(yōu)化后

stratTime = System.nanoTime();
int size = list.size();
for (int i = 0; i < size; i++) { 

}
endTime = System.nanoTime();
System.out.println("優(yōu)化list耗時:"+(endTime - stratTime));

耗時:

優(yōu)化list耗時:142500

分析總結(jié)

每次循環(huán),list.size()都會被執(zhí)行一次,這無疑會影響程序的性能,所以應(yīng)該將其放到循環(huán)外面,用一個變量來緩存其size,不要讓這一點點代碼而消耗我們這么多性能。

異常捕獲

在內(nèi)部捕獲異常

/**
     * 在內(nèi)部捕獲異常
     */
    private static void catchInner() {
        long stratTime = System.nanoTime();
        for (int i = 0; i < 10000000; i++) {
            try {
            } catch (Exception e) {
            }
        }
        long endTime = System.nanoTime();
        System.out.println("在內(nèi)部捕獲異常耗時:" + (endTime - stratTime));
    }

執(zhí)行耗時:

在內(nèi)部捕獲異常耗時:3352700

在外部捕獲異常

/**
 * 在外部捕獲異常
 */
private static void catchOuter() {
    long stratTime = System.nanoTime();
    try {
        for (int i = 0; i < 10000000; i++) {
        }
    } catch (Exception e) {

    }
    long endTime = System.nanoTime();
    System.out.println("在外部捕獲異常耗時:" + (endTime - stratTime));
}

執(zhí)行耗時:

在外部捕獲異常耗時:2893600

分析總結(jié):

捕獲異常很占用資源,所以不要把try catch放到循環(huán)內(nèi)部,優(yōu)化后性能同樣有好幾個數(shù)量級的提升。另外, 《Effective Java》一書指出for-each循環(huán)優(yōu)先于傳統(tǒng)的for循環(huán),它在簡潔性和預(yù)防bug方面有著傳統(tǒng)for循環(huán)無法媲美的優(yōu)勢,并且,沒有性能方面的損失,因此,推薦使用for-each循環(huán)。文章來源地址http://www.zghlxwxcb.cn/news/detail-590233.html

到了這里,關(guān)于【Java】Java中使用HashMap優(yōu)化多層for循環(huán)嵌套以及for循環(huán)之性能優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python---練習(xí):使用for循環(huán)嵌套實現(xiàn)打印九九乘法表

    Python---練習(xí):使用for循環(huán)嵌套實現(xiàn)打印九九乘法表

    思考: 外層 循環(huán)主要用于控制循環(huán)的 行數(shù) , 內(nèi)層 循環(huán)用于控制 列數(shù)。 基本語法: 序列1? 序列2 ,就可以是range(1, 10)? ?-----也就是從1,到9。 參考while循環(huán): 相關(guān)鏈接Python---練習(xí):使用while嵌套循環(huán)打印 9 x 9乘法表-CSDN博客 最終代碼:

    2024年02月08日
    瀏覽(19)
  • vue - 動態(tài)綁定ref(使用變量)以及獲取方式,解決v-for循環(huán)嵌套自定義子組件時無法this.$refs.xx找到動態(tài)組件的情況(詳細示例教程)適合 vue.js nuxt.js uniapp

    正常情況,我們需要在vue中獲得某個dom或者組件,我們會通過綁定 ref 然后通過綁定后的名字來獲取這個dom 。 但是,如果我們在v-for中綁定ref的話,那么這個ref就會存在多個,比如我們點擊事件讓對應(yīng)的顯示/隱藏的話,我們很難找到這個對應(yīng)的元素。 那么,這時我們需要動

    2024年02月13日
    瀏覽(27)
  • python跳出多層for循環(huán)

    刷算法題時遇到這樣一個題目,我的解法里需要使用到兩層for循環(huán),且當?shù)诙觙or循環(huán)里不滿足條件時,需要終止第一層for循環(huán) 題目描述 已知自然數(shù)1,2,…,N(1=N=100)依次入棧,請問序列C1,C2,…,CN是否為合法的出棧序列。 輸入 輸入包含多組測試數(shù)據(jù)。 每組測試數(shù)據(jù)

    2024年02月12日
    瀏覽(20)
  • python跳出多層for循環(huán)的方法

    在業(yè)務(wù)邏輯中有時候會遇到兩層for循環(huán)的情況,觸發(fā)某些條件時,需要直接退出兩層for循環(huán) 而python官方是沒有 goto 語句的那么我們可以這樣實現(xiàn) 這段代碼什么意思呢 python里面for...else...表示如果這個循環(huán)正常的走完了則會執(zhí)行else里面的代碼,異常退出則不會執(zhí)行,我們對內(nèi)

    2024年02月05日
    瀏覽(20)
  • java解析多層嵌套json字符串

    在java 程序中,經(jīng)常會涉及到各種變量值提取的問題,下面給出簡單的示例及說明: JSON實際上也是鍵值對(\\\"key\\\":\\\"value\\\"),key 必須是字符串,value 可以是合法的 JSON 數(shù)據(jù)類型(字符串, 數(shù)字, 對象, 數(shù)組, 布爾值或 null) value如果是字符串,用jsonobj.getString(\\\"key\\\")獲取 value如果是數(shù)

    2024年02月15日
    瀏覽(26)
  • Python——for循環(huán)的嵌套

    Python——for循環(huán)的嵌套

    ??用Python堅持表白一百天,每天都送10朵花,一百天表白成功! 運行代碼如下: ?

    2024年01月16日
    瀏覽(21)
  • 微信小程序for循環(huán)嵌套

    wx:for-item=“pro” pro 自定義循環(huán)體參數(shù)

    2024年04月26日
    瀏覽(23)
  • 44. python的for循環(huán)嵌套

    44. python的for循環(huán)嵌套

    嵌套是指一個對象中包含另一個與它相似的對象。 俄羅斯套娃就是典型的嵌套,一個套娃里有多個外觀相同,大小不同的娃。 【Python中的嵌套】 列表嵌套:列表的元素為列表。 if嵌套:if語句中嵌套有一個或多個if語句。 for循環(huán)嵌套:for循環(huán)語句中嵌套有一個或多個for循環(huán)

    2024年02月09日
    瀏覽(22)
  • 【C語言初學(xué)必看】一知半解的for循環(huán)嵌套for循環(huán)

    【C語言初學(xué)必看】一知半解的for循環(huán)嵌套for循環(huán)

    ?初學(xué)C語言,常常遇到for循環(huán)中嵌套個for循環(huán),初學(xué)者對于這種形式總是一知半解,這次我就整理了常見的for循環(huán)嵌套for循環(huán)的題目,我們一起爭取一舉拿下這類題。學(xué)廢他們,以后再見到就不怕啦!每天都要學(xué)一點呀。加油,奮斗的我們! ?????? 目錄? ????前言+目錄

    2024年02月02日
    瀏覽(19)
  • 【Python入門】Python循環(huán)語句(for循環(huán)的嵌套應(yīng)用)

    【Python入門】Python循環(huán)語句(for循環(huán)的嵌套應(yīng)用)

    前言 ??作者簡介: 熱愛跑步的恒川 ,致力于C/C++、Java、Python等多編程語言,熱愛跑步,喜愛音樂的一位博主。 ??本文收錄于Python零基礎(chǔ)入門系列,本專欄主要內(nèi)容為Python基礎(chǔ)語法、判斷、循環(huán)語句、函數(shù)、函數(shù)進階、數(shù)據(jù)容器、文件操作、異常模塊與包、數(shù)據(jù)可視化等,

    2024年02月10日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包