一、String 基础认识:什么是 String
String 位于 java.lang 包下,无需手动导包,直接使用;
本质是不可变的字符序列;
类被 final 修饰,不能被继承,保证底层规则不被破坏。
二、创建 String(最基础用法)

用 new 创建

三、String 底层源码结构
- 类定义源码

final:禁止被继承,保障不可变性与安全;
Serializable:支持序列化传输;
Comparable:实现字符串大小比较;
CharSequence:统一字符序列规范。
2. 底层存储演变
JDK8 及以前:底层使用 private final char[] value 存储字符;
JDK9 及以后:优化为 private final byte[] value + 编码标记;
优化目的:纯英文、数字场景下大幅节省内存空间。
四、String 不可变性(重点难点)
- 什么是不可变
字符串一旦初始化创建完成,内容无法修改、无法覆盖。拼接、截取、替换、大小写转换等所有修改操作,不会改变原字符串,只会生成一个全新的字符串对象。 - 为什么设计为不可变
底层 value 数组被 final 修饰,引用地址固定;
String 内部没有提供任何公开修改字符数组的方法;
类被 final 修饰,无法通过子类重写破坏规则;
方便常量池复用、保证线程安全、缓存哈希值。
五、String 常用核心 API
整理开发高频使用方法,附带场景说明,直接上手使用:
length():获取字符串长度;
charAt(int index):根据下标获取单个字符;
substring():截取指定区间字符串;
equals():判断内容是否一致;
isEmpty():判断字符串是否为空;
contains():判断是否包含指定字符 / 字符串;
toUpperCase() / toLowerCase():大小写转换;
trim():去除首尾空格;
split():按照指定规则分割字符串。
六、字符串拼接原理与性能
- 三种拼接方式
加号直接拼接:str + "xxx";
原生方法:concat();
可变字符串:StringBuilder / StringBuffer。 - 底层运行原理
普通单行 + 拼接:编译器自动优化,底层默认创建 StringBuilder 完成拼接;
循环中频繁 +:会反复创建、销毁 StringBuilder,产生大量垃圾对象,性能极差。 - 场景选择规范
少量简单拼接、单行代码:直接使用 +,简洁高效;
循环遍历、大量字符串拼接:必须使用 StringBuilder;
多线程并发场景拼接:使用 StringBuffer(自带锁,线程安全)。
全文总结
String 被 final 修饰,底层依赖数组实现不可变性;
字面量创建走常量池,new 创建必然在堆中生成新对象;
字符串内容对比一律使用 equals,杜绝用 ==;
吃透不可变性与常量池,才算真正掌握 Java String。
