Java String 学习
本文讲述String创建方式、不可变性、底层存储、拼接优化、intern、substring 的血泪史。先来三道送命题凭直觉答答案和原理在文末String a abc; String b abc;a b是 true 还是 falseString s new String(abc);这一行到底创建了几个对象STR.hello, \{name}这种写法2026 年的 Java 还能用吗一、两种创建方式背后的内存模型String 的存储位置分为两块堆Heap和字符串常量池String Pool也叫 intern 表。String s1 abc; // 字面量去常量池找没有就放一个返回池中对象引用 String s2 new String(abc); // new不管池里有没有堆上必 new 一个abc作为字面量会被编译器收进 class 文件的常量池类加载时解析进运行时常量池首次用到时放入字符串常量池之后所有内容相同的字面量指向同一个池对象。new String(abc)走的是构造器堆上必有一个新对象与池对象内容相同但引用不同。版本常量池位置intern 的行为JDK 6 及以前方法区永久代 PermGen把字符串复制一份放进池JDK 7移到堆中池里没同内容时直接存放对象的引用不复制JDK 8仍在堆永久代被元空间Metaspace取代同 JDK 7二、String 为什么是不可变的String 类是final的内部字符数组也是private final没有暴露任何修改入口。常量池共享的前提内容一样的字符串可以被放心复用。如果 String 可变s1改一下池里所有指向同一对象的s2、s3全跟着变共享就崩了。哈希缓存安全String缓存了hashCode初次计算后复用。内容若可变HashMap 的 key 就会改完 key 找不到桶整个集合体系会坏掉。线程安全不可变对象天然可被多线程共享不需要加锁。类加载安全类名、包名都是字符串可变字符串会让 JVM 的加载机制成为攻击面。三、底层存储从 char[] 到 byte[] coderJDK 8 及以前private final char value[]一个字符占 2 字节。JDK 9 起JEP 254Compact Strings换成byte[] value 一个byte coder标志位。coder 为 0LATIN1表示全是单字节字符只有出现中文字符等才用 UTF-16coder 为 1。四、 与 equals对象在哪引用指向谁equals比较内容String 重写了它比较引用。所有坑都出在上而结果取决于字符串是编译期定的还是运行时算的。String s1 abc; String s2 abc; System.out.println(s1 s2); // true 字面量池中复用 String s3 a b c; // 编译期常量折叠成 abc System.out.println(s1 s3); // true 折叠后就是字面量 String x ab; String s4 x c; // 含变量编译期定不了运行时拼接 System.out.println(s1 s4); // false 运行时新对象 System.out.println(s1.equals(s4)); // true 内容相同五、拼接的性能真相5.1 编译器对做了什么JDK 8 及以前javac 把a b c编译成new StringBuilder().append(a).append(b).append(c).toString()。JDK 9 起改为invokedynamicStringConcatFactory引导方法把拼接策略推迟到运行时决定——本质仍是用一个字节数组承载拼接结果开销相当。所以单次拼接不用纠结还是StringBuilder5.2 循环里拼接才是真正的坑// 慢每次迭代都新起一次完整拼接数组反复扩容拷贝复杂度 O(n²) String s ; for (int i 0; i 100000; i) { s i; } // 快一个 StringBuilder 复用O(n) StringBuilder sb new StringBuilder(); for (int i 0; i 100000; i) { sb.append(i); }StringBuilder线程不安全但快StringBuffer公开方法都带synchronized线程安全但慢单线程别用它。六、intern()手动进池与 JDK 版本差异作用如果池里有同内容字符串返回池中引用否则把当前字符串放进池返回它的引用。String s1 abc; String s2 new String(abc).intern(); System.out.println(s1 s2); // true // 更有戏剧性的 String b1 new StringBuilder(re).append(dis).toString(); // 堆对象 100 String b2 new StringBuilder(re).append(dis).toString(); // 堆对象 200 System.out.println(b1 b2); // false两个不同堆对象 System.out.println(b1.intern() b2.intern()); // true池里是同一个 System.out.println(b1 b1.intern()); // true 池中无 redisJDK7 直接把 b1 引用放进池JDK 7 之前 intern 复制副本池对象 ≠ 堆对象JDK 7 之后池存引用池对象可能就是你那个堆对象。线上大量重复字符串场景如日志里的状态枚举、重复的 JSON key可用 intern 省内存但要配合容量评估池是 native table太大也占内存七、开篇三题的答案true两个字面量内容相同指向常量池同一个对象。要看池里有没有池里已有abc时为 1 个堆上的 new 对象没有时是 2 个池中字面量 堆对象s只是引用不算对象。不能字符串模板已被撤回JDK 23 不支持直接编译报错。

相关新闻

Ubuntu 22.04下GAN图像生成实战:环境配置与训练调优

Ubuntu 22.04下GAN图像生成实战:环境配置与训练调优

在 Ubuntu 22.04 上用 GAN 做图像生成,踩坑最多的地方往往不是模型本身,而是环境、数据和训练稳定性。我最近跑通了一个 128128 人像生成项目,从装驱动到最终让生成图像达到可用的清晰度,花了大概两周。回过头看,很多问…

2026/10/4 3:22:34 阅读更多 →
DeepSeek开源大模型实战:从API接入到本地部署避坑指南

DeepSeek开源大模型实战:从API接入到本地部署避坑指南

简介:《DeepSeek:从入门到精通》由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室团队编写,以DeepSeek-R1开源推理模型为主线,面向对自然语言处理、机器学习及开源AI工具感兴趣的研发工程师和技术爱好者。资料首先介绍Dee…

2026/10/4 3:22:34 阅读更多 →
PIC18+MR25H40CDF:基于SPI MRAM的工业数据可靠存储方案

PIC18+MR25H40CDF:基于SPI MRAM的工业数据可靠存储方案

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

2026/10/4 3:22:34 阅读更多 →

最新新闻

OpenShell:把AI大模型装进终端,自然语言秒变Shell命令

OpenShell:把AI大模型装进终端,自然语言秒变Shell命令

1. OpenShell 是什么,它到底解决了什么问题第一次听到“OpenShell”这个名字,很多人会下意识觉得它是个命令行美化工具或者终端模拟器,但实际上它远不止这么简单。简单说,OpenShell 是一个跑在终端里的 AI 助手,或者说…

2026/10/4 6:31:28 阅读更多 →
INCA ProF 脚本自动化实战:从基础到老化测试全流程

INCA ProF 脚本自动化实战:从基础到老化测试全流程

1. 先搞清楚 INCA ProF 脚本是什么,别急着写代码1.1 标定工作里最浪费时间的事情在 ECU 标定和测试行业待久了,你会慢慢意识到一个事实:真正花时间的往往不是“标定思路”,而是那些看起来没什么技术含量、但你不得不一遍遍重复的操…

2026/10/4 6:31:28 阅读更多 →
AI知识库信任重建:透明标注AI生成内容的完整实践

AI知识库信任重建:透明标注AI生成内容的完整实践

1. AI知识库为什么总被读者当成垃圾先说一个现象:这两年国内外的技术团队、内容团队,甚至个人博主,都在疯狂搭建"AI知识库"。有人用Dify搭流水线,有人用RAG框架配向量库,有人直接在Obsidian里接了大模型插件…

2026/10/4 6:31:28 阅读更多 →
Superpowers:AI编程的可靠协同操作系统

Superpowers:AI编程的可靠协同操作系统

1. 项目概述:Superpowers不是插件,而是AI编程的“操作系统级增强层”你有没有过这种体验:刚用Cursor写完一段逻辑清晰的函数,运行时却在边界条件上栽了跟头;或者让Claude Code生成一个CLI工具脚本,它确实飞…

2026/10/4 6:31:28 阅读更多 →
HUMAnN 3.0 alpha:宏基因组功能通路定量分析新范式

HUMAnN 3.0 alpha:宏基因组功能通路定量分析新范式

1. 项目概述:HUMAnN 3.0(alpha)不是“升级版软件”,而是一次微生物组功能解析范式的重构HUMAnN——全称HMP Unified Metabolic Analysis Network,是微生物组学领域公认的金标准工具链之一,专用于从宏基因组…

2026/10/4 6:31:28 阅读更多 →
ZYNQ MPSoC QSPI启动与JFFS2根文件系统实战指南

ZYNQ MPSoC QSPI启动与JFFS2根文件系统实战指南

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

2026/10/4 6:30:27 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/3 9:42:36 阅读更多 →