iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JDK9对String字符串的新一轮优化
  • 222
分享到

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

2024-04-02 19:04:59 222人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

String类可以说是Java编程中使用最多的类了,如果能对String字符串的性能进行优化,那么程序的性能必然能大幅提升。 这不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的频次,同样会提升系统的性能。

小结

随着JDK的迭代String字符串的内存结构及方法等也在不断地进行演变。这是因为String字符串往往是JVM中占用内存最多的类,通过对它的改造升级,对性能的提升会更加明显。

到此这篇关于JDK9对String字符串的新一轮优化的文章就介绍到这了,更多相关JDK9对String字符串优化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

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

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JDK9对String字符串的新一轮优化
    String类可以说是Java编程中使用最多的类了,如果能对String字符串的性能进行优化,那么程序的性能必然能大幅提升。 这不JDK9就对String字符串进行了改进升级,在某些...
    99+
    2024-04-02
  • JDK9对String字符串的新一轮优化是什么
    JDK9对String字符串的新一轮优化是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。String类可以说是Java编程中使用最多的类了,如果能对Stri...
    99+
    2023-06-15
  • JDK9对String字符串怎么进行优化
    小编给大家分享一下JDK9对String字符串怎么进行优化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!String类可以说是Java编程中使用最多的类了,如果能对String字符串的性能进行优化,那么程序的性能必然能大幅...
    99+
    2023-06-14
  • c字符串,string对象,字符串字面值的区别详解
    一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串没有...
    99+
    2022-11-15
    string 字符串
  • java怎么对字符串做归一化
    在Java中,可以使用String类的一些方法对字符串进行归一化处理。下面是一些常用的归一化方法:1. 去除字符串中的空格:可以使用...
    99+
    2023-10-20
    java
  • 如何在Java中创建一个String字符串对象
    这篇文章将为大家详细讲解有关如何在Java中创建一个String字符串对象,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java中字符串对象创建有两种形式,一种为字面量形式,如String ...
    99+
    2023-05-31
    java string 字符串
  • MySQL长字符串字段的查询优化
    查询优化是提高MySQL查询性能的重要手段,对于长字符串字段的查询优化,可以从以下几个方面入手:1. 索引优化:对于经常被查询的长字...
    99+
    2023-09-13
    MySQL
  • Python f-string字符串格式化的方式
    本篇内容主要讲解“Python f-string字符串格式化的方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python f-string字符串格式化的方式”吧!1、python支持字符串格...
    99+
    2023-06-20
  • Java之一文详解String字符串的用法
    目录一. String字符串简介1. 概述2. 与字符的区别3. 定义方式3.1 构造方法定义3.2 直接赋值定义二. 字符串实用方法1. 字符串的比较方法2. 判断字符串是否为空3...
    99+
    2023-05-19
    Java String字符串用法 Java String字符串 Java String
  • Python格式化字符串f-string的使用教程
    目录楔子实现 repr 打印整数的进制转换整数的填充浮点数的小数保留任意字符的填充日期的截取f-string 的注意事项小结楔子 在 Python3.6 之前,格式化字符串一般会使用...
    99+
    2024-04-02
  • String字符串拼接方法concat和+的效率对比
    目录两个方法效率计算代码如下多次测试结果如下字符串拼接 和concat的区别两个方法效率计算代码如下 public static void main(String[] args)...
    99+
    2024-04-02
  • ES6中字符串string常用的新增方法有哪些
    这篇文章主要为大家展示了“ES6中字符串string常用的新增方法有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中字符串string常用的新增方法有...
    99+
    2024-04-02
  • php中将对象转化为字符串的方法
    本文将为大家详细介绍“php中将对象转化为字符串的方法”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php中将对象转化为字符串的方法”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去...
    99+
    2023-06-06
  • 优化Go语言字符串拼接性能的技巧
    优化Go语言字符串拼接性能的技巧 在Go语言中,字符串的拼接是一个常见的操作。然而,如果处理不当,会导致性能下降。本文将介绍一些优化Go语言字符串拼接性能的技巧,包括使用不同的拼接方法...
    99+
    2024-03-12
    性能 字符串 go语言 数据格式化
  • PHP从字符串中的图像流新建一图像
    这篇文章将为大家详细讲解有关PHP从字符串中的图像流新建一图像,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 从字符串中的图像流新建图像 引言 在许多 PHP 场景中,例如图像处理、表单处理或从数据...
    99+
    2024-04-02
  • java如何判断一个字符串是前后对称的
    这篇文章将为大家详细讲解有关java如何判断一个字符串是前后对称的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如何判断一个字符串是前后对称的什么意思呢就好像一个字符串,前后一折,是对称的。就像你站在镜子...
    99+
    2023-06-27
  • PHP如何将一个一维数组的值转化为字符串
    这篇文章将为大家详细讲解有关PHP如何将一个一维数组的值转化为字符串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。将一维数组的值转换为字符串 简介 在 PHP 中,一维数组是一种存储在连续内存位置上的数据...
    99+
    2024-04-02
  • js对字符串和数字进行加法运算的一些情况
    对字符串和数字进行加法运算 两个数字相加,返回数字相加的和,如果数字与字符串相加,返回字符串,如下实例: 实例 x=5+5; y="5"+5; z="Hello"+5; x,y, 和...
    99+
    2023-02-13
    字符串数字相加 数字字符串加法运算
  • 更优雅的C++字符串格式化实现方法详解
    目录背景优化实现使用背景 在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接的,...
    99+
    2023-05-16
    C++实现字符串格式化 C++字符串格式化 C++字符串 C++格式化
  • nodejs将JSON字符串转化为JSON对象报错的解决
    如何将JSON字符串转化为JSON对象? JSON.parse(str) JSON是javascript的一个内置对象,提供了转换JSON对象与字符串互相转换的方法;    问题来了...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作