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月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
2734 83
|
人工智能 编解码
通义万相2.1:VBench榜单荣登第一!阿里通义万相最新视频生成模型,支持生成1080P长视频
万相2.1是阿里通义万相最新推出的视频生成模型,支持1080P无限长视频生成,具备复杂动作展现、物理规律还原、艺术风格转换等功能。
3165 27
通义万相2.1:VBench榜单荣登第一!阿里通义万相最新视频生成模型,支持生成1080P长视频
|
数据采集 API 开发工具
项目支付接入支付宝【沙箱环境】
该博客文章详细介绍了如何在PC端项目中接入支付宝支付功能,特别是在沙箱环境中的配置和实现步骤。文章提供了详细的配置指南,包括获取支付宝公钥和私钥、配置沙箱应用环境、生成密钥、设置服务端代码以及调用支付接口等步骤,并附有相应的代码示例和说明。
项目支付接入支付宝【沙箱环境】
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
4359 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
消息中间件 存储 缓存
消息中间件系列教程(06) -RabbitMQ -五种队列形式
消息中间件系列教程(06) -RabbitMQ -五种队列形式
2270 1
|
存储 缓存 安全
ConcurrentHashMap的实现原理,非常详细,一文吃透!
本文详细解析了ConcurrentHashMap的实现原理,深入探讨了分段锁、CAS操作和红黑树等关键技术,帮助全面理解ConcurrentHashMap的并发机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
ConcurrentHashMap的实现原理,非常详细,一文吃透!
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
1948 1
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
1759 1

热门文章

最新文章