首页/新闻资讯/正文详情

【Java】String 详解:底层原理、常量池、不可变性

发布时间:2026/11/11 2:39:42 来源:云帆数科 栏目:资讯中心
【Java】String 详解:底层原理、常量池、不可变性
前言java.lang.String代表字符串Java 中所有双引号括起来的字符串字面量都是 String 对象。核心 String 是不可变字符序列底层在 JDK9 之后由 char [] 改为 byte [] 存储依靠final修饰实现不可变。一、底层源码JDK 8public final class String implements java.io.Serializable, ComparableString, CharSequence { private final char[] value; }final classString 类不能被继承private final char[] value存放字符串内容数组引用不可变数组内容无法外部修改。JDK 9private final byte[] value; private final byte coder;改用byte[] 编码标记coder字符串只有拉丁字符英文 / 数字使用ISO-8859-11 字节存 1 字符节省内存包含中文等使用 UTF-162 字节。目的降低大量英文场景下 String 内存占用。二、String 不可变性重中之重不可变一旦字符串对象创建完成字符串内容不能被修改。注意不是 String 引用不能变是对象本身内容不能修改。示例代码String s abc; s def;并不是把原来abc对象改成def 而是新建一个字符串对象 defs 引用指向新对象旧的 abc 还在内存等待 GC。String str hello; str.concat(world); System.out.println(str); // hello原字符串不变concat、substring、replace这类方法不会修改原字符串只会返回新 String 对象。不可变优点字符串常量池复用多个引用指向同一个常量池对象节省内存哈希值hashCode只需要计算一次适合作为 HashMap key线程安全不可变对象天然线程安全多线程并发访问无竞争。缺点频繁字符串拼接会产生大量中间临时对象造成 GC 压力。解决方案频繁拼接使用StringBuilder/StringBuffer。三、字符串常量池 String Pool字符串常量池存放在 JDK8 之后的堆内存JDK7 从永久代移到堆。作用复用字面量字符串避免重复创建相同字符串对象。两种创建 String 方式1、字面量方式String s1 abc优先去常量池查找常量池存在 abc直接返回常量池对象引用不存在在常量池创建 abc 对象返回引用。2、new 方式String s2 new String(abc)会创建最多 2 个对象先检查常量池有没有 abc没有就在常量池创建new 在堆上再创建一份 String 对象value 数组指向常量池字符数组s2 保存堆中对象的地址。代码对比String s1 abc; String s2 new String(abc); System.out.println(s1 s2); // false // s1指向常量池对象s2指向堆对象地址不一样intern () 方法s.intern()拿到字符串对象去常量池查找。如果常量池已有相同字符串返回常量池引用JDK8常量池没有则把堆中这个字符串引用放入常量池返回该引用。String s new String(a) new String(b); s.intern(); String s2 ab; System.out.println(s s2); // trueJDK8四、字符串拼接1. 字面量编译期优化String s1 a b; // 编译器直接优化成 String s1 ab;编译期常量直接合并放入常量池。2. 变量拼接运行期String a a; String b b; String s3 a b;编译后底层自动创建StringBuilderappend 拼接最后 toString () 生成新 String 对象不会进入常量池。结论带变量的拼接底层是 StringBuilder。循环内用拼接字符串会频繁创建 StringBuilder 和 String性能差。String、StringBuilder、StringBuffer 对比类可变性线程安全性能适用场景String不可变安全低拼接产生大量对象少量字符串常量StringBuilder可变不安全高单线程频繁拼接StringBuffer可变加 synchronized安全较低多线程拼接极少用五、 和 equals比较引用地址基本类型比较值引用类型判断是否是同一个对象。equals()String 重写了该方法比较字符串内容是否相等。String s1 new String(test); String s2 new String(test); System.out.println(s1 s2); // false两个堆对象 System.out.println(s1.equals(s2)); // true内容相同六、常见坑点substringJDK6 存在内存泄漏截取会保留原 char [] 引用JDK7 修复重新拷贝字符数组。空字符串和null是正常 String 对象内容为空null 代表引用没有指向任何对象调用方法会空指针。不要用判断字符串内容业务代码一律用equals最好常量放前面abc.equals(str)防止空指针。大量循环拼接字符串不要用优先 StringBuilder。String 作为 HashMap key因为不可变hashCode 固定非常合适如果可变对象做 key修改后 hash 变化无法 get。七、面试高频问答Q1String 为什么不可变A底层 value 数组用 private final 修饰String 类 final 不可继承。好处常量池复用、hashCode 缓存、线程安全。Q2String snew String (abc) 创建几个对象A最多 2 个。常量池一个堆中 new 一个如果常量池已经存在 abc只会创建堆里 1 个。Q3字符串拼接底层原理A常量字面量相加编译器直接优化合并变量相加底层使用 StringBuilder。Q4intern () 作用JDK7 和 JDK8 有什么变化A将字符串尝试放入常量池。JDK7 及以后常量池放在堆intern 发现常量池没有直接保存堆对象引用不复制对象。Q5StringBuilder 和 StringBuffer 区别AStringBuffer 方法加 synchronized线程安全性能差StringBuilder 非线程安全单线程推荐。结语String 是 Java 基础重中之重核心不可变性、常量池、两种创建对象差异、 拼接底层、intern ()、 与 equals。写代码记住比较字符串内容使用 equals循环拼接使用 StringBuilder。

相关推荐

免安装上手downkyi便携版:从解压到批量下载的完整实操手册
免安装上手downkyi便携版:从解压到批量下载的完整实操手册

免安装上手downkyi便携版:从解压到批量下载的完整实操手册 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&a… · 2026/11/5 10:29:49

GatedDeltaNet架构深度解析:短卷积、门控机制与Delta Rule如何协同工作
GatedDeltaNet架构深度解析:短卷积、门控机制与Delta Rule如何协同工作

【免费下载链接】GatedDeltaNet [ICLR 2025] Official PyTorch Implementation of Gated Delta Networks: Improving Mamba2 with Delta Rule 项目地址: https://gitcode.com/gh_mirrors/ga/GatedDeltaNet 点击查看 免费下载 GatedDeltaNet(Gated Delta… · 2026/11/4 7:25:54

微信/QQ 聊天图片视频怎么导出到电脑?我写了个免费离线的安卓备份工具
微信/QQ 聊天图片视频怎么导出到电脑?我写了个免费离线的安卓备份工具

换手机时最麻烦的不是通讯录和照片,而是攒了几年的聊天文件:图片、视频、语音、文档散落在微信、QQ、TIM、企业微信的十几个目录里。聊天记录本体可以用官方的迁移功能搬走,但聊天产生的媒体文件,官方一直没给"批量导出"… · 2026/11/5 16:57:46

贵阳学电工证多少钱 之前考的证在外省能不能转过来
贵阳学电工证多少钱 之前考的证在外省能不能转过来

贵阳学电工证多少钱 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题几乎是所有准备考电工证或者已经考了但没在本地的小伙伴都关心的问题。贵阳学电工证多少钱?很多人可能只关注价格,但更关心的是证能不能全国通用。答案是:… · 2026/11/11 2:39:08

电工证中午安排考试如何换证?外省证书能转过来吗?
电工证中午安排考试如何换证?外省证书能转过来吗?

电工证中午安排考试如何换证?外省证书能转过来吗? 之前考的证在外省能不能转过来?很多电工朋友在办理或换证过程中都遇到过这个问题,特别是那些在外地打工、换工作地点频繁的建筑工人。其实,只要你的 电子证书… · 2026/11/11 2:39:08

低压电工证有含金量嘛全国通用报名流程全解析
低压电工证有含金量嘛全国通用报名流程全解析

低压电工证有含金量嘛全国通用报名流程全解析 你学历不高怕报不上名?低压电工证有含金量嘛?别急,这证 全国通用 ,门槛不高,关键看你怎么走。下面我用多年从业经验,给你拆解清楚这证到底值不值、怎么考、怎么用,南阳卧龙区的水利水电工也适用,别再被… · 2026/11/11 2:39:08

叶县哪里可以考电工证 2026河南最新政策怎么走
叶县哪里可以考电工证 2026河南最新政策怎么走

叶县哪里可以考电工证 2026河南最新政策怎么走 实操考试心里没底怕挂科?你不是一个人。2026年河南最新政策出台后,越来越多的应届工程类毕业生开始关注叶县哪里可以考电工证,想提前规划自己的职业道路。别急,今天就把整个流程拆解清楚,手把手教… · 2026/11/11 2:39:08

富阳电工证报名时间怎么查?工地太忙根本没时间复习考试
富阳电工证报名时间怎么查?工地太忙根本没时间复习考试

富阳电工证报名时间怎么查?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多电工从业者的真实写照。尤其在富阳这种工程项目密集的地区,很多电工师傅一边要赶工期,一边还得抽空准备电工证考试。但问题来了, 富阳电工证报名时间怎么查… · 2026/11/11 2:39:08

电工证延期复审申请通过率揭秘,别让证件断档影响你找工作
电工证延期复审申请通过率揭秘,别让证件断档影响你找工作

电工证延期复审申请通过率揭秘,别让证件断档影响你找工作 你现在急需特种作业证才能上岗找工作,但电工证马上到期,复审申请又不知道从哪下手,怕耽误工期、怕被停工整顿、怕被罚款,这些焦虑我都懂。今天咱们就来聊聊【电工证延期复审申请】,告诉你怎么操… · 2026/11/11 2:38:08

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43

_中职电工证最新政策解读
_中职电工证最新政策解读

中职电工证在哪考?工地太忙根本没时间复习考试的救星来了 工地太忙根本没时间复习考试,这是很多正在备考 中职电工证 的建筑工友的真实写照。你不是不想考,而是真的没时间。但别担心,这期内容是 新乡初次报考人员… · 2026/11/11 0:00:52

昆明电工证培训价格值不值得考?老电工告诉你真相
昆明电工证培训价格值不值得考?老电工告诉你真相

昆明电工证培训价格值不值得考?老电工告诉你真相 之前考的证在外省能不能转过来?这个问题是很多在外地打工、换城市生活、或者是想在昆明发展的朋友最关心的。尤其是现在云南发展快,很多企业都在招持证上岗的电工,如果你手头有证但不在本地,那这个证是不… · 2026/11/11 0:00:52

特种电缆张工网上查询全攻略:外省证如何转过来
特种电缆张工网上查询全攻略:外省证如何转过来

特种电缆张工网上查询全攻略:外省证如何转过来 之前考的证在外省能不能转过来?这是很多特种作业从业者最关心的问题,尤其是像特种电缆张工这类证书,直接关系到日常工作是否合规、能否顺利晋升。很多小伙伴因为证书归属地的问题,陷入职业发展的瓶颈,甚至… · 2026/11/11 0:00:52

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码