真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JDK9對String字符串的新一輪優(yōu)化是什么

JDK9對String字符串的新一輪優(yōu)化是什么,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出會(huì)寧免費(fèi)做網(wǎng)站回饋大家。

String類可以說是Java編程中使用最多的類了,如果能對String字符串的性能進(jìn)行優(yōu)化,那么程序的性能必然能大幅提升。

這不JDK9就對String字符串進(jìn)行了改進(jìn)升級(jí),在某些場景下可以讓String字符串內(nèi)存減少一半,進(jìn)而減少JVM的GC次數(shù)。

String的底層存儲(chǔ)

在面試的時(shí)候我們通常會(huì)說String字符串有不可變的特性,每次都要?jiǎng)?chuàng)建新的字符串。那么,為什么String字符串是不可變的呢?

先來看一下String字符串的底層存儲(chǔ)結(jié)構(gòu):

public final class String     implements java.io.Serializable, Comparable, CharSequence {          private final char value[];      public String() {         this.value = "".value;     }      public String(String original) {         this.value = original.value;         this.hash = original.hash;     }     // ... }

看到什么了?當(dāng)我們new一個(gè)String對象時(shí),對應(yīng)的字符串其實(shí)是以char數(shù)組的形式存儲(chǔ)在String對象內(nèi)部。而這個(gè)char數(shù)組是final的,也就是說不可變的。

這也就是為什么我們說String字符串擁有不可變的特性,當(dāng)字符串改變了,char數(shù)組不可變,就只能創(chuàng)建一個(gè)新的對象,新的char數(shù)組了。

底層存儲(chǔ)的優(yōu)化

上面說的情況是JDK8及以前版本,到了JDK9,String中字符串的存儲(chǔ)不再用char數(shù)組了,改用byte數(shù)組。

public final class String     implements java.io.Serializable, Comparable, CharSequence {      @Stable     private final byte[] value;      private final byte coder;          @Native static final byte LATIN1 = 0;     @Native static final byte UTF16  = 1;          static final boolean COMPACT_STRINGS;        public String() {         this.value = "".value;         this.coder = "".coder;     }      @HotSpotIntrinsicCandidate     public String(String original) {         this.value = original.value;         this.coder = original.coder;         this.hash = original.hash;     }          // ... }

不僅將char數(shù)組改為byte數(shù)組,而且新增了一個(gè)coder的成員變量。

在程序中,絕大多數(shù)字符串只包含英文字母數(shù)字等字符,使用Latin-1編碼,一個(gè)字符占用一個(gè)byte。如果使用char,一個(gè)char要占用兩個(gè)byte,會(huì)占用雙倍的內(nèi)存空間。

但是,如果字符串中使用了中文等超出Latin-1表示范圍的字符,使用Latin-1就沒辦法表示了。這時(shí)JDK會(huì)使用UTF-16編碼,那么占用的空間和舊版(使用char[])是一樣的。

coder變量代表編碼的格式,目前String支持兩種編碼格式Latin-1和UTF-16。Latin-1需要用一個(gè)字節(jié)來存儲(chǔ),而UTF-16需要使用2個(gè)字節(jié)或者4個(gè)字節(jié)來存儲(chǔ)。

據(jù)說這一改進(jìn)方案是JDK的開發(fā)人員用大數(shù)據(jù)和人工能智能,調(diào)研了成千上萬的應(yīng)用程序的heapdump信息后,得出:大部分的String都是以Latin-1字符編碼來表示的,只需要一個(gè)字節(jié)存儲(chǔ)就夠了,兩個(gè)字節(jié)完全是浪費(fèi)。

COMPACT_STRINGS屬性則是用來控制是否開啟String的compact功能。默認(rèn)情況下是開啟的。可以使用-XX:-CompactStrings參數(shù)來對此功能進(jìn)行關(guān)閉。

改進(jìn)的好處

改進(jìn)的好處是非常明顯的,首先如果項(xiàng)目中使用Latin-1字符集居多,內(nèi)存的占用大幅度減少,同樣的硬件配置可以支撐更多的業(yè)務(wù)。

當(dāng)內(nèi)存減少之后,進(jìn)一步導(dǎo)致減少GC次數(shù),進(jìn)而減少Stop-The-World的頻次,同樣會(huì)提升系統(tǒng)的性能。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


網(wǎng)站標(biāo)題:JDK9對String字符串的新一輪優(yōu)化是什么
網(wǎng)站URL:http://weahome.cn/article/geschi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部