日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK 9 对字符串 String 的优化,挺有意思!

發布時間:2025/3/11 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK 9 对字符串 String 的优化,挺有意思! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

這不JDK9就對String字符串進行了改進升級,在某些場景下可以讓String字符串內存減少一半,進而減少JVM的GC次數。

String的底層存儲

在面試的時候我們通常會說String字符串有不可變的特性,每次都要創建新的字符串。那么,為什么String字符串是不可變的呢?

先來看一下String字符串的底層存儲結構:

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

看到什么了?當我們new一個String對象時,對應的字符串其實是以char數組的形式存儲在String對象內部。而這個char數組是final的,也就是說不可變的。

這也就是為什么我們說String字符串擁有不可變的特性,當字符串改變了,char數組不可變,就只能創建一個新的對象,新的char數組了。

底層存儲的優化

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

public?final?class?Stringimplements?java.io.Serializable,?Comparable<String>,?CharSequence?{@Stableprivate?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;}@HotSpotIntrinsicCandidatepublic?String(String?original)?{this.value?=?original.value;this.coder?=?original.coder;this.hash?=?original.hash;}//?... }

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

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

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

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

據說這一改進方案是JDK的開發人員用大數據和人工能智能,調研了成千上萬的應用程序的heapdump信息后,得出:大部分的String都是以Latin-1字符編碼來表示的,只需要一個字節存儲就夠了,兩個字節完全是浪費。

COMPACT_STRINGS屬性則是用來控制是否開啟String的compact功能。默認情況下是開啟的。可以使用-XX:-CompactStrings參數來對此功能進行關閉。

改進的好處

改進的好處是非常明顯的,首先如果項目中使用Latin-1字符集居多,內存的占用大幅度減少,同樣的硬件配置可以支撐更多的業務。

當內存減少之后,進一步導致減少GC次數,進而減少Stop-The-World的頻次,同樣會提升系統的性能。

總結

隨著JDK的迭代String字符串的內存結構及方法等也在不斷的發展演變,一方面是精于求精的態度,另一個更重要的原因是String在代碼中很常見,并且它往往是JVM中占用內存最多的一類數據,因此對它(String)的優化收益非常大。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的JDK 9 对字符串 String 的优化,挺有意思!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。