返回顶部
首页 > 资讯 > 精选 >JDK9对String字符串的新一轮优化是什么
  • 903
分享到

JDK9对String字符串的新一轮优化是什么

2023-06-15 16:06:22 903人浏览 泡泡鱼
摘要

jdk9对String字符串的新一轮优化是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。String类可以说是Java编程中使用最多的类了,如果能对Stri

jdk9对String字符串的新一轮优化是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

这不JDK9就对String字符串进行了改进升级,在某些场景下可以让String字符串内存减少一半,进而减少JVMGC次数。

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的频次,同样会提升系统的性能。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: JDK9对String字符串的新一轮优化是什么

本文链接: https://lsjlt.com/news/280865.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JDK9对String字符串的新一轮优化是什么
    JDK9对String字符串的新一轮优化是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。String类可以说是Java编程中使用最多的类了,如果能对Stri...
    99+
    2023-06-15
  • JDK9对String字符串的新一轮优化
    String类可以说是Java编程中使用最多的类了,如果能对String字符串的性能进行优化,那么程序的性能必然能大幅提升。 这不JDK9就对String字符串进行了改进升级,在某些...
    99+
    2024-04-02
  • JDK9对String字符串怎么进行优化
    小编给大家分享一下JDK9对String字符串怎么进行优化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!String类可以说是Java编程中使用最多的类了,如果能对String字符串的性能进行优化,那么程序的性能必然能大幅...
    99+
    2023-06-14
  • java怎么对字符串做归一化
    在Java中,可以使用String类的一些方法对字符串进行归一化处理。下面是一些常用的归一化方法:1. 去除字符串中的空格:可以使用...
    99+
    2023-10-20
    java
  • Python的字符串格式化方法是什么
    这篇文章主要介绍了Python的字符串格式化方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python的字符串格式化方法是什么文章都会有所收获,下面我们一起来看看吧。Python在字符串格式化的两种方...
    99+
    2023-07-06
  • python字符串转化为数字的方法是什么
    Python中可以使用`int()`函数将字符串转化为整数。例如:```pythonnum_str = "123"num = int...
    99+
    2023-09-25
    python
  • Python中字符串格式化的方法是什么
    Python中字符串格式化的方法有两种: 使用百分号(%)进行格式化,例如: name = 'Alice' ...
    99+
    2024-04-02
  • Java中的字符串是什么
    这篇文章给大家分享的是有关Java中的字符串是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java中的字符串String : 内容不可更换的StringBuffer :  线程安全的StringB...
    99+
    2023-06-03
  • Golong字符串拼接性能优化方法及原理是什么
    这篇文章主要介绍了Golong字符串拼接性能优化方法及原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golong字符串拼接性能优化方法及原理是什么文章都会有所收获,下面我们一起来看看吧。1.字符串高效...
    99+
    2023-07-05
  • python对字符串加密解密的方法是什么
    Python中常用的字符串加密解密方法有以下几种:1. 使用base64模块进行加密解密:- 加密:使用`base64.b64enc...
    99+
    2023-08-24
    python
  • java字符串数组初始化的方法是什么
    Java中字符串数组的初始化有多种方法,以下是其中几种常见的方式:1. 使用大括号直接初始化数组元素:javaString[] ar...
    99+
    2023-10-18
    java
  • c语言字符串格式化的方法是什么
    在C语言中,字符串格式化是通过使用printf()函数和相关的格式控制符来完成的。格式控制符用于指定要打印或输出的数据类型和格式。 ...
    99+
    2023-10-28
    c语言
  • c#字符串数组初始化的方法是什么
    在C#中,可以使用以下几种方法来初始化字符串数组: 直接在声明时初始化数组元素: string[] colors = { &quo...
    99+
    2024-04-02
  • javascript中字符串指的是什么
    小编给大家分享一下javascript中字符串指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在javascript中,字符串(String)就是由零个或...
    99+
    2023-06-15
  • C#字符串的性能是什么
    本篇内容介绍了“C#字符串的性能是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介你在代码中处理C#字符串的方法可能会对性能产生令人吃...
    99+
    2023-06-17
  • php字符串的组成是什么
    这篇文章主要讲解了“php字符串的组成是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php字符串的组成是什么”吧!php字符串是由一系列的字符组成,其中每个字符等同于一个字节,这意味着...
    99+
    2023-07-05
  • java中的字符串池是什么
    今天就跟大家聊聊有关java中的字符串池是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。字符串池是Java的一个特性,可以通过一段代码理解。String a = "He...
    99+
    2023-05-31
    java 字符串池 ava
  • MySQL字符集性能优化的方法是什么
    MySQL字符集性能优化的方法包括: 选择合适的字符集:尽量选择较小的字符集,如latin1比utf8更节省存储空间和查询时间。...
    99+
    2024-04-09
    MySQL
  • javascript解析json字符串为对象的方法是什么
    JavaScript中可以使用JSON.parse()方法将JSON字符串解析为JavaScript对象。JSON.parse()方...
    99+
    2023-05-13
    javascript解析json javascript json
  • Python中的字符串指的是什么
    这篇文章将为大家详细讲解有关Python中的字符串指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。摘要:本文将告诉您Python中的字符串是什么,并向您简要介绍有关该概念的所有知识。本文将介绍以下...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作