深圳网站建设团队,河北企业建网站,出国游做的好的网站,ppt模板免费素材1、典型回答
String 底层是基于数组实现的#xff0c;并且数组使用了 final 修饰#xff0c;不同版本中的数组类型也是不同的#xff1a;
JDK9 之前#xff08;不含JDK9#xff09; String 类是使用 char[ ]#xff08;字符数组#xff09;实现的但 JDK9 之后#xf…1、典型回答
String 底层是基于数组实现的并且数组使用了 final 修饰不同版本中的数组类型也是不同的
JDK9 之前不含JDK9 String 类是使用 char[ ]字符数组实现的但 JDK9 之后String 使用的是 byte[ ] 字节数组实现的
注1个字符char 2个字节byte
String 实现源码如下JDK21 2、全面剖析
String底层是基于 char[ ] 数组或 byte[ ] 数组实现的JDK9 之后之所以使用 byte[ ] 替换 char[ ] 数组这是因为byte类型粒度更细一个 char 等于 2 个 byte。对于大部分的英文字符和少量中文字符来说使用 1 个 byte就够了完全不需要使用 1 个 char 进行存储所以 JDK9 使用 byte[ ] 之后对于大部分英文字符来说同样的内容其存储空间减少了一半这就是 JDK9 之后使用 byte[ ] 所带来的优势
3、知识扩展
字符串存储在 JVM 的哪个区域
String字符串的值是存储在字符串常量池的而字符串常量池在 《Java 虚拟机规范》中是属于方法区但在 JVM 默认的虚拟机 Hotspot 中在 JDK7 的时候就将 字符串常量池 和 静态变量 从方法区的具体实现永久代中移除放到堆上了。
之后的版本JDK8 之后移除了永久代取而代之的是元空间它是存储在本地内存也叫直接内存中的但字符串常量池和静态变量依然存储在堆上并未改动