Java 9 紧凑String改进[JEP 254]Java9新特性

教程分享 > Java教程 (2813) 2024-04-17 12:33:23

    在Java 8中,Java中的String由内部表示char[]。每个char存储在内存中的2个字节中。oracle的JDK开发人员分析了大量客户端的应用程序堆转储,他们注意到大多数字符串只能使用拉丁-1字符集表示。拉丁字符1可以存储在一个字节中,比char数据类型存储少50%(1个字节)。

    因此,JDK开发者默认将String类内部存储设置为byte[]from char[]。这导致在堆内存中节省大量空间,因为通常,字符串对象占据堆内存的很大一部分。[ 来源 ]

您可以使用-XX:-CompactStrings参数java命令来控制应用程序中此功能的使用。

 

Java 9之前的字符串类(String)

在Java 9之前,字符串数据被存储为一个字符数组。这需要每个字符16位。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
 
    //The value is used for character storage.
    private final char value[];
 
}

 

Java 9之后的字符串类(String)

从Java 9开始,字符串现在在内部使用字节数组以及用于编码引用的标志字段来表示。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
 
    /** The value is used for character storage. */
    @Stable
    private final byte[] value;
 
    /**
     * The identifier of the encoding used to encode the bytes in
     * {@code value}. The supported values in this implementation are
     *
     * LATIN1
     * UTF16
     *
     * @implNote This field is trusted by the VM, and is a subject to
     * constant folding if String instance is constant. Overwriting this
     * field after construction will cause problems.
     */
    private final byte coder;
 
}

'java'命令参考

我们知道该java命令用于启动Java应用程序。它可以有许多参数来定制应用程序运行时。一个这样的命令如下:

-XX:-CompactStrings

禁用紧凑字符串功能。默认情况下,此选项已启用。启用此选项时,仅包含单字节字符的Java字符串将在内部表示,并使用ISO-8859-1 / Latin-1编码以单字节字符串的形式存储。这使得只包含单字节字符的字符串所需的空间量减少了50%。对于包含至少一个多字节字符的Java字符串:使用UTF-16编码将这些字符表示并存储为每个字符2个字节。禁用紧凑字符串功能强制使用UTF-16编码作为所有Java字符串的内部表示。

禁用紧凑字符串可能有益的情况包括:

  1. 当知道一个应用程序压倒多数将分配多字节字符串
  2. 在从Java SE 8迁移到Java SE 9时观察到性能回退的意外事件中,分析显示Compact Strings引入了回归

在这两种情况下,禁用紧凑字符串都是有道理的。

提示:这纯粹是一个实现变化,没有改变现有的公共接口。

 

https://www.leftso.com/article/410.html

相关文章
Java 9 紧凑String改进[JEP 254],Java9新特性
Java 9 模块化编程
Java语言中,String类型能被继承吗?为什么?
JDK11 Java String 新增方法,Java的String类可能会获得一些JDK 11的新方法,预计将于2018年9月发布。
JDK 11 String 新方法使用教程
ie9 jquery ajax跨域问题解决, ajax ie9 跨域问题解决,jquery,ajax,ie9
Java编程float转换为String并保留n位小数
Java 11(2018 年 9 月发布)包含许多重要且有用的更新
IE9 jQuery ajax文件上传兼容问题解决。主要通过jQuery的jquery.form插件解决的IE9不支持formData的文件上传问题。
问题描述idea启动maven的JavaFX项目报错:Exception in Application start method java.lang.reflect.InvocationTarg...
DbVisualizer9.5.7软件的激活,DbVisualizer9.5.7中文乱码处理等一些列Q&A,DbVisualizer,DbVisualizer9中文乱码,DbVisualizer...
Java编程之spring boot FastDFS Java client使用,Java编程,FastDFS Java客户端
Java编程之Spring Cloud Hystrix Circuit熔断/断路
java编程之java jwt token使用,autho0的Java-jwt框架使用,java编程,java-jwt
设置数据源将数据写入到 Model 中 @RequestMapping("/menulist") public String MenuManagerList(M