JDK9对String字符串的新一轮优化,不可不知

IT科技类资讯2025-11-05 12:59:32886

 

本文转载自微信公众号「程序新视界」,不可不知作者二师兄。字符转载本文请联系程序新视界公众号。新轮

String类可以说是优化Java编程中使用最多的类了,如果能对String字符串的不可不知性能进行优化,那么程序的字符性能必然能大幅提升。

这不JDK9就对String字符串进行了改进升级,新轮在某些场景下可以让String字符串内存减少一半,优化进而减少JVM的不可不知GC次数。

String的字符底层存储

在面试的时候我们通常会说String字符串有不可变的特性,每次都要创建新的新轮字符串。那么,优化为什么String字符串是不可不知不可变的呢?

先来看一下String字符串的底层存储结构:

public final class String     implements 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 String     implements java.io.Serializable, Comparable<String>, 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数组改为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中占用内存最多的类,通过对它的改造升级,对性能的提升会更加明显。

本文地址:http://www.bhae.cn/html/22f20399774.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

使用Inteli7920玩游戏(探索i7920处理器的游戏性能和优势)

Windows7系统资源管理器文件夹智能(自动展开)

Windows7右下角网络图标(小电脑)不停转圈的解决方法

windows 7系统下bootMGR is missing无法开机解决方法

魅族MX4(一款高性能手机的实际表现与用户评价)

windows7中出现"不能安全删除移动硬盘"的提示如何解决

Win 7系统怎么添加或删除输入法?方法介绍

windows 7如何快速显示桌面以及窗口变透明技巧

友情链接

滇ICP备2023000592号-9