String 底层是如何实现的?

简介: 本文介绍了String类在Java中的底层实现,说明在JDK9之前String是基于`char[]`字符数组实现的,而JDK9及之后版本则使用`byte[]`字节数组实现,这种改变使得存储英文字符时空间效率提高,同时解释了字符串常量池的存储位置随JDK版本的演变。

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 之后)移除了永久代,取而代之的是元空间,它是存储在本地内存(也叫直接内存)中的,但字符串常量池和静态变量依然存储在堆上,并未改动

目录
相关文章
|
6月前
|
C语言 C++
【C++】string的底层剖析以及模拟实现
【C++】string的底层剖析以及模拟实现
|
C语言 C++ 容器
内置类string常用接口及模拟实现【C++】【STL】【附题】
内置类string常用接口及模拟实现【C++】【STL】【附题】
55 0
|
3月前
|
安全 编译器 C语言
【C++数据结构】string的模拟实现
【C++数据结构】string的模拟实现
|
3月前
|
存储 程序员 API
八股day05_API、String对象和集合
day05_API、String对象和集合
|
4月前
|
缓存 NoSQL Redis
Redis深度解析:核心数据类型之string
Redis 数据类型包括String、Hash、List、Set和Sorted Set。对于String类型的主要操作, 此外,还有通用的Key操作。
|
6月前
|
安全
String、StringBuuffer、StringBuilder三者的区别
String、StringBuuffer、StringBuilder三者的区别
string的简单实现
string的简单实现
62 0
|
11月前
|
存储
String你知道多少细节(含面试题)
String你知道多少细节(含面试题)
50 0
|
C语言 C++
在VS和g++下的string结构的区别
在VS和g++下的string结构的区别
|
存储 NoSQL 安全
一.Redis中那些你不知道的秘密-五大基本结构String的实现原理
Redis已经成为解决高并发的必备利器,你可能已经把它玩的很熟了,但是对于它的底层,你又了解几分呢? 本篇文章我们来聊聊Redis中那些你不知道的秘密之Redis五大基本结构的实现原理。你也许知道Redis常用的存储结构有 String,List,Set,ZSet,Hash,但还远远不够,本文章将带你一步一步走进Redis更深处的奥秘。