Java String类深入了解JDK各个版本进阶版本

Java String类深入了解JDK各个版本进阶版本

一,底层类型

在jdk11中 String value 存储字符串值 是byte[] 数组 ,String中存储字节码的是coder 也是byte类型,因此String的底层数据存储类型成为了byte类型

而在jdk8中String 的String value 存储字符串值 是char[] 数组,因此 因此可以看出在jdk8中String底层数据存储类型成为了char类型

二,"coder"属性

JDK 8中的String类没有"coder"属性,而JDK 11中的String类引入了"coder"属性。这是因为在JDK 8及之前的版本中,Java字符串内部使用的是UTF-16编码,每个字符占用两个字节。在JDK 8中,String类仅保存了一个字符数组(char[])来存储字符串的内容。

而在JDK 9及之后的版本中,Java引入了Compact Strings(紧凑字符串)的概念,以节省内存空间。在这种情况下,String类的实现采用了一种称为Latin-1的编码方式,即对于只包含拉丁字符(Unicode码点小于等于255)的字符串,只需要一个字节来存储每个字符。这样做可以显著减少内存消耗。

为了支持这种新的编码方式,JDK 11中的String类引入了"coder"属性,用于标识字符串使用的编码类型。在JDK 11中,String类内部的字符数组(byte[])只存储Latin-1编码的字符,而针对非拉丁字符的部分,会通过调用StringCoding类的方法进行转码和处理,转码之后依然是byte[]数组

可以说JDK 11中的String类引入了"coder"属性是为了支持紧凑字符串的优化,以提高性能和节省内存空间。

jdk选择更换String的底层存储类型的原因是为了降低资源的浪费,char存储是两个字节,而byte存储为1个字节

三,hash 字段

String 内部包含了一个 private 修饰的int 类型的hash 字段 用于缓存字符串的哈希代码 当第一次调用String a 的时候 a会调用HashCode 进行计算哈希码,当下次再次调用a的时候会直接调用hash而不会再调用hashCode 原因是当第一次调用HashCode的时候HashCode 计算哈希码并赋值给hash。如果a的值不发生改变以后的每次调用a都是从hash里面进行获取哈希码进行获取存储的值

四,hashIsZero 字段

在 JDK 17 中,String 类新增了一个名为 hashIsZero 的私有字段,用于表示字符串的哈希码是否为零。这个字段主要用于优化字符串哈希码的计算和存储。

在 JDK 17 中,String 类的哈希码计算方式发生了改变。之前的版本中,String 类的哈希码是延迟计算的,即在第一次调用 hashCode 方法时才会计算并缓存哈希码。而在 JDK 17 中,哈希码将在字符串被创建时立即计算,并存储在 hash 字段中。同时,新增的 hashIsZero 字段用于标记哈希码是否为零,以便快速判断字符串的哈希码状态。

这种优化可以提高字符串哈希码的计算和比较性能,并且在某些场景下可以避免不必要的哈希码计算。因此,hashIsZero 字段在新版 JDK 中是为了提升字符串处理的性能而引入的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486650.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

shell编程-jq命令详解

文章目录 前言一、jq简介1. 简介2. 语法3. 命令选项 二、用于处理json数据1. 过滤1.1 标识运算符1.2 基本过滤1.3 获取对象属性1.3 迭代数组元素1.4 获取数组元素1.5 使用运算符 2. 类型和值2.1 数组构造2.2 对象构造2.3 递归下降 3. 内置运算符和函数3.1 算术运算符3.2 函数3.…

Makefile的override

今天在编译opengauss extension时遇到一个报错: 简单的理解就是编译时要加 -fPIC,告诉编译器生成Position Independent Code,试过 make CPPFLAGS-fPIC 可以成功编译,不过看到其它的解决方案是在Makefile中加 override CPPFLAG…

代码随想录算法训练营第三十天 | 332.重新安排行程,51. N皇后 ,37. 解数独

这道题是一道欧拉路径/ 欧拉回路的一笔画问题,需要找出开销最小的一笔画方案 这种一笔画的问题,以前学数据结构的时候我们习惯把图放进二维数组中存储,但对于这种无规律的图结构,我们可以使用二维的哈希表来存储,这样…

【4月】CDA Club 第2期数据分析组队打卡学习活动开启!

活动名称 CDA Club 第2期数据分析组队打卡学习活动 活动介绍 本次打卡活动由CDA俱乐部旗下学术部主办。目的是通过数据分析科普内容,为数据分析爱好者提供学习和交流的机会。方便大家利用碎片化时间在线学习,以组队打卡的形式提升学习效果&#xff0c…

水离子雾化壁炉的原理和技术解析

水离子雾化壁炉采用超声波雾化技术将水分子雾化成微细的水离子,然后通过风扇吹出再经过UVC紫外线杀菌产生安全仿真的火焰效果。以下是水离子雾化壁炉的原理和技术解析: 超声波雾化技术: 水离子雾化壁炉利用超声波振动器产生高频振动&#xf…

[Java、Android面试]_13_map、set和list的区别

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注收…

TSN协议原理!看完这一篇就够了(1)——时钟同步IEEE802.1AS-2020

▎前言 在许多应用场景中,一个本地局域网中互联的设备集群需要共享同一个时间,以支持各设备的协同工作。例如:音频设备与视频设备的配合播放,雷达与摄像头的数据融合等;这样一个看似简单的域功能,细化成为…

好书推荐 :《 提问的艺术:让 ChatGPT 给出高质量答案 》

AGI 时代降临!还不知如何向 ChatGPT 提问? 恰当的提示至关重要!《提问的艺术—让 ChatGPT 给出高质量答案》一书,共 24 章,系统介绍了如何向 ChatGPT 提问以获取优质答案,是 ChatGPT 时代的入门指南&#x…

【 Mysql8.0 忘记登录密码 可以试试 】

** Mysql8.0 忘记登录密码 可以试试 ** 2024-3-21 段子手168 1、首先停止 mysql 服务 ,WIN R 打开运行,输入 services.msc 回车打开服务,找到 mysql 服务,停止。 然后 WIN R 打开运行,输入 CMD 打开控制台终端输…

‘npm‘ 不是内部或外部命令,也不是可运行的程序

npm认识三年了,今天才知道这是node.js的命令 也就是说,想要在cmd里面运行 npm 命令,但就的安装node.js 1. node.js安装 没有安装包的先下载安装包:下载 | Node.js 中文网 (nodejs.cn) 下载之后双击打开,一路安装确…

如何为企业策划一场XR虚拟直播?

活动年年办,都是老一套,想玩点新花样? 预算有限,但还是想把活动办的逼格高一点? 想通过活动,让更多的人知道自己企业的品牌? 随着AIGC技术的不断演变,企业活动的形式和内容也在不…

Node.js之沙盒专题

​ Node.js一直是薄弱项,今天特意整理一下,基本上是各个大佬写的大杂烩,仅用于学习记录~~~ 1. child_process 首先介绍一下nodejs中用来执行系统命令的模块child_process。Nodejs通过使用child_process模块来生成多个子进程来处理其他事物…

滤波器自动化测试:用网络分析仪、示波器、功率计测量功率

滤波器的功率是电压与电流的乘积,滤波器的功率可以通过测量电压与电流计算得出。滤波器的功率对滤波器的稳定运行是至关重要的,如果功率过小可能会导致滤波器无法正常工作;功率越大则有可能会造成滤波器的损坏。因此滤波器的功率测量是非常重要的步骤。 …

基于51单片机的客车汽车安全气囊控制器Proteus仿真

地址:https://pan.baidu.com/s/10enj1EYm_0Z8f_19Sz_eCQ 提取码:1234 仿真图: 芯片/模块的特点: AT89C52简介: AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公…

第一周周考技能

文章目录 1月1. 任意输入一个3位整数(100~999,包含100与999),判断输入的整数是否是质数,如果是质数则输出是质数,否则输出不是质数2.“降序数”是指一个自然数的低位数字不大于高位数字的数。例如&#xff…

工单系统大揭秘!选择工单系统需注意的关键因素!

如何选择工单系统?工单系统作为数字化工具,可以帮助企业高效处理工单业务问题,助力企业数字化转型。目前市面上的工单系统可谓是琳琅满目。 本文详细讲解了目前市面上工单系统的主要类型,以及企业该如何选择工单系统~ 一、工单系…

怎样批量在文件名后面加上相同的字符?

怎样批量在文件名后面加上相同的字符?在日常工作中,有时我们需要对大量文件进行批量处理,比如在文件名后面统一添加相同的字符。这项工作可以通过编写简单的脚本或程序来实现,从而提高工作效率。批量在文件名后面加上相同的字符是…

JS-13-高阶函数

一、高阶函数的定义 JavaScript的函数其实都指向某个变量,如: var abs function (x) {// 函数体 }; 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函…

CCF-CSP认证考试 202212-2 训练计划 100分题解

更多 CSP 认证考试题目题解可以前往:CSP-CCF 认证考试真题题解 原题链接: 202212-2 训练计划 时间限制: 1.0s 内存限制: 512.0MB 问题背景 西西艾弗岛荒野求生大赛还有 n n n 天开幕! 问题描述 为了在大赛中取得…

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中,如果你想通过命令行查询出一系列匹配某个关键词的进程,并使用xargs命令批量结束这些进程,可以按照以下步骤操作: # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者,如果…