亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

java - 使用lambda表達式(匿名內部類)傳參是否有性能問題?

瀏覽:58日期:2024-01-08 15:02:16

問題描述

編程有一條原則如下:

避免創建不必要的對象:最好能重用對象,而不要在每次需要的時候就創建一個相同功能的新對象。

請看如下代碼:

List<String> names = Arrays.asList('peter', 'anna', 'mike', 'xenia'); // 1、匿名內部類Collections.sort(names, new Comparator<String>() { @Override public int compare(String a, String b) {return b.compareTo(a); }});//2、lambda表達式Collections.sort(names, (a, b) -> b.compareTo(a));

是不是每次排序都創建了一個新的Comparator對象,導致性能降低?那么還主張使用Lambda表達式嗎

問題解答

回答1:

首先回答你的問題:是不是每次排序都創建了一個新的Comparator對象,導致性能降低?那么還主張使用Lambda表達式嗎?不是,主張

根本原因Lamdba表示根本就不是匿名內部類的語法糖,也就是說Lambda表達式底層實現不是匿名內部類的實現方式,他們其實兩個東西

怎么證明呢? 匿名內部類其實在編譯的時候會生成一個類文件,命名以ClassName$數字的方式,所以要是Lamdba表達式底層也是由匿名內部類的方式實現的話,那肯定也會生成一個同樣類似的內文件 所以我們簡單把你的例子分別寫在不同包下面的類,再在來檢查編譯后的效果 匿名內部類實現 InnerTest

java - 使用lambda表達式(匿名內部類)傳參是否有性能問題? 這是class文件,可以看到有兩個

java - 使用lambda表達式(匿名內部類)傳參是否有性能問題?

lambda表達式 LamdbaTest

java - 使用lambda表達式(匿名內部類)傳參是否有性能問題?

然而class文件只有一個

java - 使用lambda表達式(匿名內部類)傳參是否有性能問題? 所以真相只有一個,哈哈,很顯然,這根本就不是一個東西嘛

那Lamdba表達式是怎么實現的? 我們可以來看看他們的字節碼,這樣骨子里的不一樣就完全展示出來了 InnerTest java - 使用lambda表達式(匿名內部類)傳參是否有性能問題? LamdbaTest

java - 使用lambda表達式(匿名內部類)傳參是否有性能問題?

可以看到兩者使用的指令都是不一樣的,Lamdba表達式在解析時,使用的是Java7新增的invokedynamic指令,如果你熟悉你這個指令的話,那就可能瞬間明白了,不熟悉的話,你可以問問度娘 不過你可以直接從這個指令名字體會出:動態調用 因此,其實不同于匿名內部類被編譯成一個類文件,Lamdba表達式是被編譯成了一個靜態方法,我們-p可以再看一次就知道了,生成的方法名叫lambda$main$0

java - 使用lambda表達式(匿名內部類)傳參是否有性能問題?

所以結合之前兩個反編譯的結果可以看到,lamdba表達式運行整體思路大致如下 1. lamdba表達式被編譯生成當前類的一個私有靜態方法 2. 在原調用Lamdba方法的地方編譯成了一個invokedynamic指令調用,同時呢也生成了一個對應的BootstrapMethod 3. 當lamdba表達式被JVM執行,也就是碰到2中說到的invokedynamic指令,該指令引導調用LambdaMetafactory.metafactory方法,該方法返回一個CallSite實例 4. 而這個CallSite實例中的target對象,也就是直接引用到一個MethodHandle實例,而這個MethodHandle實例會調用到1中生成的靜態方法,在上面的例子就是`lambda$main$0`這個方法,完成整個lamdba表達式的使用

再說一句 其實可以看到lamdba表達式在某種意義上的確比匿名內部類好很多,無論是性能,可讀性還是大勢~哈哈,我要說大勢,是因為lamdba表達式后續可以優化的空間更廣,反正我是在java中用慣了,相當喜歡

回答2:

每次排序并不會創建一個新的 Comparator 對象,一般情況下 Lambda 表達式對應的實例(instance)一旦在內存中產生,那么 JVM 在當前環境下會重復使用這個實例。具體的說明,可以參考這個鏈接:Run-Time Evaluation of Lambda Expressions

在可以提升程序可讀性和開發效率的前提下,主張使用 Lambda 表達式

回答3:

可以靜態聲明一個Lambda表達式內部匿名類對象;

朝生夕滅的小對象對JVM來說不是大問題;

標簽: java
相關文章:
主站蜘蛛池模板: 999久爱视频在线观看 | 国产一级小视频 | 70岁老妇女一级毛片爽 | 国产免费一级精品视频 | 香港经典a毛片免费观看爽爽影院 | 久草在线视频播放 | 亚洲国产精品久久卡一 | 麻豆网站 | 亚洲 欧美 日韩 在线 香蕉 | 伊人久久亚洲综合 | 久久香蕉国产线看观看网站 | 制服丝袜在线播放 | 国产人成精品香港三级古代 | 韩国黄色一级 | 久久一区二区免费播放 | 中文字幕最新中文字幕中文字幕 | 日本精品高清一区二区不卡 | 亚洲九九香蕉 | 国产亚洲精品久久久久久久久激情 | 一级特黄aa大片欧美 | 国产色视频网站 | 日韩免费高清一级毛片在线 | 亚洲欧美日韩一级特黄在线 | 亚洲成年看片在线观看男男 | 国产欧美精品区一区二区三区 | 女人被狂躁的免费视频网站软件 | 成人免费福利视频在线观看 | 在线看黄网址 | 日韩精品一区在线 | 99热在线获取最新地址 | 久久久久久久久久久9精品视频 | 免费看欧美一级特黄α大片 | 香蕉视频免费在线播放 | 国产精品一区在线观看 | 激情国产| 女人一级毛片免费观看 | 婷婷色中文字幕 | 亚洲免费美女视频 | 91天堂亚洲精品一区 | 国产成人yy免费视频 | 欧美一区精品二区三区 |