国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

問題描述

編程有一條原則如下:

避免創(chuàng)建不必要的對(duì)象:最好能重用對(duì)象,而不要在每次需要的時(shí)候就創(chuàng)建一個(gè)相同功能的新對(duì)象。

請(qǐng)看如下代碼:

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

是不是每次排序都創(chuàng)建了一個(gè)新的Comparator對(duì)象,導(dǎo)致性能降低?那么還主張使用Lambda表達(dá)式嗎

問題解答

回答1:

首先回答你的問題:是不是每次排序都創(chuàng)建了一個(gè)新的Comparator對(duì)象,導(dǎo)致性能降低?那么還主張使用Lambda表達(dá)式嗎?不是,主張

根本原因Lamdba表示根本就不是匿名內(nèi)部類的語法糖,也就是說Lambda表達(dá)式底層實(shí)現(xiàn)不是匿名內(nèi)部類的實(shí)現(xiàn)方式,他們其實(shí)兩個(gè)東西

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

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

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

lambda表達(dá)式 LamdbaTest

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

然而class文件只有一個(gè)

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

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

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

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

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

所以結(jié)合之前兩個(gè)反編譯的結(jié)果可以看到,lamdba表達(dá)式運(yùn)行整體思路大致如下 1. lamdba表達(dá)式被編譯生成當(dāng)前類的一個(gè)私有靜態(tài)方法 2. 在原調(diào)用Lamdba方法的地方編譯成了一個(gè)invokedynamic指令調(diào)用,同時(shí)呢也生成了一個(gè)對(duì)應(yīng)的BootstrapMethod 3. 當(dāng)lamdba表達(dá)式被JVM執(zhí)行,也就是碰到2中說到的invokedynamic指令,該指令引導(dǎo)調(diào)用LambdaMetafactory.metafactory方法,該方法返回一個(gè)CallSite實(shí)例 4. 而這個(gè)CallSite實(shí)例中的target對(duì)象,也就是直接引用到一個(gè)MethodHandle實(shí)例,而這個(gè)MethodHandle實(shí)例會(huì)調(diào)用到1中生成的靜態(tài)方法,在上面的例子就是`lambda$main$0`這個(gè)方法,完成整個(gè)lamdba表達(dá)式的使用

再說一句 其實(shí)可以看到lamdba表達(dá)式在某種意義上的確比匿名內(nèi)部類好很多,無論是性能,可讀性還是大勢(shì)~哈哈,我要說大勢(shì),是因?yàn)閘amdba表達(dá)式后續(xù)可以優(yōu)化的空間更廣,反正我是在java中用慣了,相當(dāng)喜歡

回答2:

每次排序并不會(huì)創(chuàng)建一個(gè)新的 Comparator 對(duì)象,一般情況下 Lambda 表達(dá)式對(duì)應(yīng)的實(shí)例(instance)一旦在內(nèi)存中產(chǎn)生,那么 JVM 在當(dāng)前環(huán)境下會(huì)重復(fù)使用這個(gè)實(shí)例。具體的說明,可以參考這個(gè)鏈接:Run-Time Evaluation of Lambda Expressions

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

回答3:

可以靜態(tài)聲明一個(gè)Lambda表達(dá)式內(nèi)部匿名類對(duì)象;

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

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 日本理论在线播放 | 看久久| 日本一区二区三区精品视频 | 精品国产一区二区三区在线 | 亚洲tv成人天堂在线播放 | 日本精品久久久久中文字幕 1 | 黄a 大片a v 永久免费 | 2021国产精品自在拍在线播放 | 一级国产视频 | 色在线看| 免费特黄一级欧美大片在线看 | 97久久精品 | 狠狠色丁香婷婷综合 | 日韩精品一区二区三区 在线观看 | 日韩精品小视频 | 国产系列在线观看 | 中国老太卖淫播放毛片 | 扒开双腿猛进入喷水免费视频 | 国产精品免费一区二区三区四区 | 亚洲一区二区三区中文字幕 | 香蕉三级| 亚洲特级毛片 | 香港经典a毛片免费观看看 香港经典a毛片免费观看爽爽影院 | 久久精品免费一区二区三区 | 亚洲国产精品自在现线让你爽 | 日产乱码精品一二三区 | 成人网在线视频 | 国产成人精品视频免费 | 狠狠色丁香婷婷综合小时婷婷 | 国产第九页 | 欧美很黄视频在线观看 | 性理论片 | 日本欧美一区二区三区不卡视频 | 国产一级毛片一区二区三区 | 看中国一级毛片 | 久久99国产精一区二区三区! | 久草视频免费在线 | 三级毛片免费观看 | 日韩欧免费一区二区三区 | 精品国产网 | 台湾三级香港三级经典三在线 |