亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                Java 深入JVM分析String StringTable

                文章目錄

                基本特性:

                1、字符串常量池Jdk1.7之前位于方法區(qū),1.7開始位于堆

                2、字符串常量池中同樣的數(shù)據(jù)只存儲(chǔ)一份(固定大小HashTable存儲(chǔ)數(shù)據(jù))

                3、使用 -XX:StringTableSize 可設(shè)置大小,不會(huì)像HashMap一樣動(dòng)態(tài)擴(kuò)容,值太小造型Hash沖突嚴(yán)重,調(diào)用String.interns時(shí)性能會(huì)大幅下降

                4、Jdk1.8中默認(rèn)大小60013,1009是可設(shè)置最小值

                字符串拼接:

                1、通過(guò)StringBuilder的append()方法拼接字符串,自始至終只會(huì)創(chuàng)建一個(gè)StringBuilder的對(duì)象

                2、使用String的字符串拼接,每次拼接都會(huì)創(chuàng)建一個(gè)StringBuilder和String對(duì)象,內(nèi)存占用增大,也會(huì)增加GC頻率

                字符串拼接優(yōu)化:

                1、理論上初始化StringBuilder對(duì)象時(shí),指定大小,從而設(shè)的數(shù)組大小,可以提高效率(減少擴(kuò)容、復(fù)制次數(shù))

                2、但是,通過(guò)測(cè)試,發(fā)現(xiàn)設(shè)定大小與不設(shè)定,耗時(shí)相差無(wú)幾(毫秒)

                intern方法的使用:

                情況一:intern方法會(huì)從字符串常量池中查詢當(dāng)前字符串是否存在,若不存在,則會(huì)將當(dāng)前字符串放入常量池中并把地址返回棧中引用,存在則將地址返回給棧中引用。

                String s1 = “JavaEEHadoop”; //在字符串常量池中創(chuàng)建 “JavaEEHadoop”String s2 = new String(“JavaEEHadoop”).intern(); //會(huì)將字符串常量池中 “JavaEEHadoop” 地址 返回s2System.out.println(s1 == s2); true

                情況二:如果對(duì)象在堆中已經(jīng)創(chuàng)建了,字符串常量池中就不需要再創(chuàng)建新的對(duì)象了,而是直接保存堆中對(duì)象的引用,也就節(jié)省了一部分的內(nèi)存空間

                下述情況適用于Jdk1.7、1.8

                /*** 此代碼會(huì)在字符串常量池中 創(chuàng)建 “JavaEE”、”Hadoop“* 會(huì)使用StringBUilder來(lái)拼接,最后執(zhí)行toString方法* * 此時(shí)在堆中是存在值為 “JavaEEHadoop” 的字符串對(duì)象的*/String s1 = new String(“JavaEE”) + new String(“Hadoop”);/*** 由于s1在堆中已存在,因此為了節(jié)省空間,字符串常量池中并不會(huì)創(chuàng)建 “JavaEEHadoop”* 而是保存 堆中對(duì)象的引用*/s1.intern();/*** 由于此刻字符串常量池中已存在,因此s2會(huì)指向常量池中 堆中對(duì)象的引用*/String s2 = “JavaEEHadoop”;System.out.println(s1 == s2); true

                是否引用同一份對(duì)象?

                String s1 = “JavaEE”;String s2 = “Hadoop”;String s3 = “JavaEEHadoop”;/*** 編譯器優(yōu)化 為 JavaEEHadoop,s3 == s4 為true,在字符串常量池中同一份*/String s4 = “JavaEE” + “Hadoop”;System.out.println(s3 == s4); true/*** 如果拼接符號(hào)的前后出現(xiàn)了變量* 1、StringBuilder.toString中 s = new StringBuilder();* 2、s.append(“JavaEE”);* 3、s.append(“Hadoop”);* 4、s.toString(); –>類似于 new String(char[])* 但跟String s = new String(“JavaEEHadoop”)不一樣* 由于StringBuilder.toString中new String中參數(shù)是char[]數(shù)組* 因此并不會(huì)在字符串常量池中創(chuàng)建 ”JavaEEHadoop“*/String s1 = “JavaEE”; //字符串常量池中 “JavaEE”String s2 = “Hadoop”; //字符串常量池中 “Hadoop”String s3 = “JavaEEHadoop”;String s4 = s1 + “Hadoop”; String s5 = s1 + s2;System.out.println(s3 == s4); falseSystem.out.println(s3 == s5); false/*** final修飾的string變量相加時(shí),編譯器會(huì)優(yōu)化為 ab,不會(huì)用StringBuilder拼接* s11 == s12 為true,在字符串常量池中同一份* s12會(huì)被編譯器優(yōu)化為 “ab”*/final String s1 = “a”;final String s2 = “b”;String s3 = “ab”;String s4 = s1 + s2;System.out.println(s2 == s4); true

                創(chuàng)建了幾個(gè)對(duì)象?

                /*** 創(chuàng)建了1個(gè)或2個(gè)* 執(zhí)行步驟,對(duì)應(yīng)字節(jié)碼步驟* * 1、堆中開辟String對(duì)象空間 new #8 * 2、如果 “ab” 在字符串常量池中存在,那么久不創(chuàng)建,如果不存在則創(chuàng)建* 3、初始化String對(duì)象*/String s1 = new String(“ab”);/*** 字節(jié)碼*/步驟1、new #17 步驟1、dup步驟2、ldc #14 步驟3、invokespecial #18 /*** 如果字符串常量池中 “a”、”b”不存在,那么會(huì)創(chuàng)建6個(gè)對(duì)象* * 執(zhí)行步驟對(duì)應(yīng)字節(jié)碼步驟* 1、堆中開辟StringBuilder對(duì)象空間,初始化StringBuilder對(duì)象 * 2、堆中開辟String對(duì)象空間* 3、在字符串常量池中創(chuàng)建 “a”* 4、初始化String對(duì)象* 5、執(zhí)行append方法* * 6、堆中開辟String對(duì)象空間* 7、在字符串常量池中創(chuàng)建 “b”* 8、初始化String對(duì)象* 9、執(zhí)行append方法* 10、執(zhí)行toString方法* StringBuilder對(duì)象toString方法執(zhí)行說(shuō)明,由于返回的是String對(duì)象,因此會(huì)執(zhí)行toString方法* 11、堆中開辟String對(duì)象空間* 由于調(diào)用的是new String(char[])構(gòu)造方法* 因此并不會(huì)在字符串常量池中創(chuàng)建 “ab”*/String s1 = new String(“a”) + new String(“b”);/*** 字節(jié)碼文件*/步驟1、new #8 步驟1、dup步驟1、invokespecial #9 步驟2、new #17 步驟2、dup步驟3、ldc #12 步驟4、invokespecial #18 步驟5、invokevirtual #10 步驟6、new #17 步驟6、dup步驟7、ldc #13 步驟8、invokespecial #18 步驟9、invokevirtual #10 步驟10、invokevirtual #11 步驟11、new #80 步驟11、dup//我們可以看到toString方法中并沒(méi)有 在字符串常量池中創(chuàng)建 “ab”aload_0getfield #234 iconst_0aload_0getfield #233 invokespecial #291 areturn

                提示:這里對(duì)文章進(jìn)行總結(jié):

                建議大家不要卷、不要卷、不要卷

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月16日 06:13
                下一篇 2022年6月16日 06:13

                相關(guān)推薦

                • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

                  對(duì)于微商朋友來(lái)說(shuō),朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營(yíng)一個(gè)朋友圈,有的微商看起來(lái)逼格滿滿,實(shí)際效果也不錯(cuò);而有的卻動(dòng)都不動(dòng)就被屏蔽甚至拉黑…

                  2022年11月27日
                • 奶茶的做法和配方(草莓奶茶的做法和配方)

                  今天小編給各位分享奶茶的做法和配方的知識(shí),其中也會(huì)對(duì)草莓奶茶的做法和配方進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開始吧! 奶茶的怎么做法 主料 牛奶200ml…

                  2022年11月26日
                • 怎么轉(zhuǎn)行總結(jié)出成功轉(zhuǎn)行的3個(gè)步驟

                  01 前段時(shí)間,由麥可思研究院發(fā)布的《就業(yè)藍(lán)皮書:2019年中國(guó)大學(xué)生就業(yè)報(bào)告》顯示,2018大學(xué)畢業(yè)生半年內(nèi)的離職率為33%,主動(dòng)離職的主要原因是“個(gè)人發(fā)展空間不夠”和“薪資福利…

                  2022年11月26日
                • 《寶可夢(mèng)朱紫》夢(mèng)特性怎么獲得?隱藏特性獲取方法推薦

                  寶可夢(mèng)朱紫里有很多寶可夢(mèng)都是擁有夢(mèng)特性會(huì)變強(qiáng)的寶可夢(mèng),很多玩家不知道夢(mèng)特性怎么獲得,下面就給大家?guī)?lái)寶可夢(mèng)朱紫隱藏特性獲取方法推薦,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 …

                  2022年11月25日
                • 《寶可夢(mèng)朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

                  寶可夢(mèng)朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)?lái)寶可夢(mèng)朱紫奇魯莉安進(jìn)化方法分享,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

                  2022年11月25日
                • 免費(fèi)清理c盤的軟件(清理c盤空間不影響系統(tǒng))

                  電腦用久了慢如龜速,還卡頓,這最大的原因啊就是C盤空間不足造成的。 即使電腦配置再好,或者硬盤再快,如果長(zhǎng)時(shí)間沒(méi)有打掃C盤,打開文件或者穩(wěn)定之類的,都卡得讓人頭大。 這時(shí)候呢不要去…

                  2022年11月24日
                • 把一個(gè)新產(chǎn)品成功推向市場(chǎng)的6個(gè)步驟解析(如何推廣新產(chǎn)品)

                  據(jù)說(shuō),給人留下第一印象的機(jī)會(huì)只有一次。無(wú)論是新工作的第一天,還是見你的另一半的父母,或是把你自己介紹給別人,你都希望能表現(xiàn)得風(fēng)度翩翩、討人喜歡、優(yōu)雅。 推出一個(gè)新產(chǎn)品也是如此。即使…

                  2022年11月24日
                • 《寶可夢(mèng)朱紫》暴飛龍?jiān)趺醋ィ勘╋w龍獲得方法

                  寶可夢(mèng)朱紫暴飛龍位置在哪?在游戲中,很多玩家還不清楚暴飛龍具體要怎么樣獲得,其實(shí)獲得方法很簡(jiǎn)單,暴飛龍直接是沒(méi)得抓的,需要玩家從寶貝龍進(jìn)化得到,下面一起來(lái)看一下寶可夢(mèng)朱紫暴飛龍獲得…

                  2022年11月23日
                • 《寶可夢(mèng)朱紫》布土撥怎么進(jìn)化?布土撥進(jìn)化方法介紹

                  寶可夢(mèng)朱紫中,不同的寶可夢(mèng)有不同的進(jìn)化方法,其中布土撥的進(jìn)化方法是比較特殊的。很多玩家不知道寶可夢(mèng)朱紫布土撥怎么進(jìn)化,下面就帶來(lái)寶可夢(mèng)朱紫布土撥進(jìn)化方法介紹,一起來(lái)看看吧,希望能幫…

                  2022年11月23日
                • 《寶可夢(mèng)朱紫》薄荷怎么獲得?薄荷獲得方法

                  寶可夢(mèng)朱紫中薄荷有改變寶可夢(mèng)的屬性或性格等效果,很多玩家想知道寶可夢(mèng)朱紫薄荷怎么獲得,下面就帶來(lái)寶可夢(mèng)朱紫薄荷獲得方法,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 薄荷獲得方法…

                  2022年11月23日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息