首页 > 编程语言 >Java String类深入了解JDK各个版本进阶版本

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

时间:2024-03-25 18:02:04浏览次数:38  
标签:存储 调用 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 中是为了提升字符串处理的性能而引入的。

标签:存储,调用,Java,String,JDK,哈希,字符串,版本
From: https://blog.csdn.net/qq_49841284/article/details/137021155

相关文章

  • Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻直播带货及 免 费 小程序商城
    随着互联网的快速发展,越来越多的企业开始注重数字化转型,以提升自身的竞争力和运营效率。在这个背景下,鸿鹄云商SAAS云产品应运而生,为企业提供了一种简单、高效、安全的数字化解决方案。鸿鹄云商SAAS云产品是一种基于云计算的软件服务,旨在帮助企业实现业务流程的自动化和优化。......
  • Java版企业电子招投标系统源代码,支持二次开发,采用Spring cloud技术
     在数字化时代,采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过SpringCloud、SpringBoot2、Mybatis等先进技术,打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过待办消息、招标公告、......
  • 卡码java基础课 | 18.洗盘子
    学习内容:栈的基本概念(空栈、栈顶、栈底)和特点(先入后出)入栈、出栈、获取栈顶元素和判断栈是否为空栈等基本操作Stack类的使用重点归纳:栈:后进先出,LIFO,lastinfirstout。使用方法:importjava.util.Stack。常用方法:isEmpty():判断栈是否为空栈,如果为空栈返回true,否则或者f......
  • java实现Array
    publicclassMyArray{privateint[]array;privateintsize;publicMyArray(intcapacity){this.array=newint[capacity];size=0;}publicvoidinsert(intelement,intindex)throwsException{//判断访问下标是否超出......
  • 【附源码】JAVA计算机毕业设计应聘小程序(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的快速发展,互联网已经深入到人们生活的方方面面,特别是在求职招聘领域,传统的线下招聘方式已经无法满足现代社会的需求。目前,企业招聘和求......
  • 【附源码】JAVA计算机毕业设计应急信息管理及统计分析系统(springboot+mysql+开题+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息化时代,应急管理面临着前所未有的挑战和机遇。随着自然灾害、事故灾难等突发事件频发,对应急信息的管理和统计分析提出了更高要求。传统的信息管......
  • 【附源码】JAVA计算机毕业设计应急物资管理系统(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着自然灾害和突发事件的频发,应急物资管理的重要性日益凸显。传统的物资管理方式往往存在着信息不透明、响应速度慢、资源分配不均等问题,难以满足现......
  • Java中String、StringBuffer、StringBuilder 的区别
    目录1.String2.StringBuffer3.StringBuilder4.使用情况如果帮助到你,别忘了点赞收藏关注String、StringBuffer和StringBuilder在Java中都用于处理字符串数据,但它们之间在功能和性能上有一些关键的区别:1.String不可变性:String类的对象是不可变的。每次对String对......
  • Java并发面试题(一)
    1.并行和并发有什么区别?并行(Parallelism)和并发(Concurrency)在计算机科学中都是关于处理多个任务或操作的重要概念,但它们之间存在显著的差异。以下是并行和并发的主要区别:并发(Concurrency):任务交错执行:并发指的是两个或多个任务在同一时间段内开始,但它们的执行是交错进行的......
  • JAVA 使用POI实现单元格行合并
    POI实现单元格行合并实现效果引入jar代码实现controller层Service层ServiceImpl层实现类实现效果如果最后面的三行数据大于1时那么前面十二行就需要行合并引入jar<dependency><groupId>org.apache.poi</groupId><artifactId......