151
社区成员
发帖
与我相关
我的任务
分享
在 Java 开发中,String 类是使用最频繁的类之一,字符串操作几乎贯穿所有业务逻辑。String 看似简单,但其底层设计、不可变性、字符串常量池等知识点,是面试与高质量编码的必考核心内容。
一、String 是什么
String 是 Java 用于表示字符串的类,位于 java.lang 包下,程序启动即可直接使用。
字符串本质是不可变的字符数组,任何对字符串内容的修改都会产生新对象,而非修改原值。
二、String 最核心特性:不可变性
Java 中的字符串是不可变对象,一旦创建就不能被修改。
为什么不可变?
源码层面决定:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
}
1. String 类被 final 修饰,不能被继承
2. 底层存储数据的 char[] 被 final 修饰
3. 所有修改方法(substring、replace、toUpperCase)都返回新字符串
不可变的好处
• 线程安全,多线程无需同步
• 哈希值固定,适合作为 HashMap 键
• 字符串常量池可复用,节省内存
• 安全可靠,防止被意外篡改
三、字符串创建方式与内存区别
1. 字面量方式(推荐)
String s1 = "hello";
直接在字符串常量池中创建或复用对象,效率高、省内存。
2. new 方式
String s2 = new String("hello");
会在堆中创建新对象,再指向常量池中的“hello”,
执行一次 new 至少创建一个或两个对象,不推荐频繁使用。
四、字符串比较必须用 equals()
• ==:比较对象的内存地址
• equals():比较字符串内容
正确写法:
if (str.equals("abc")) { ... }
更安全写法(避免空指针):
if ("abc".equals(str)) { ... }
五、字符串常量池(String Pool)
字符串常量池是 JVM 专门为字符串开辟的一块内存区域,目的是共享复用字符串,减少重复创建。
• 字面量字符串自动进入常量池
• 相同内容的字符串在池中只存一份
• intern() 方法可手动将字符串入池
大量重复字符串场景下,常量池能明显节省内存、提升性能。
六、String、StringBuilder、StringBuffer 区别
这是面试必考知识点:
1. String
◦ 不可变
◦ 每次修改产生新对象
◦ 适合少量字符串操作
2. StringBuilder
◦ 可变
◦ 线程不安全
◦ 效率最高
◦ 适合单线程大量拼接
3. StringBuffer
◦ 可变
◦ 线程安全(方法带 synchronized)
◦ 效率较低
◦ 适合多线程拼接场景
循环拼接字符串严禁使用 String + ,必须用 StringBuilder。
七、常用方法(高频使用)
str.length() // 长度
str.charAt(i) // 获取第i个字符
str.equals(s) // 比较内容
str.contains("xx") // 是否包含子串
str.substring(2,5) // 截取
str.split(",") // 分割
str.trim() // 去两端空格
str.toUpperCase() // 转大写
str.indexOf("a") // 查找下标
八、实际开发注意事项
• 不要在循环中使用 + 拼接字符串,会产生大量垃圾对象
• 优先使用字面量创建字符串,少用 new String(...)
• 比较内容永远用 equals
• 空安全优先使用 "xxx".equals(str)
• 大量拼接优先选择 StringBuilder
九、总结
String 是 Java 最基础也最重要的类,其不可变性和常量池机制是理解字符串性能与安全的关键。
熟练掌握 String 的创建、比较、拼接方式,能有效避免内存浪费、空指针与线程安全问题,是写出稳定、高效 Java 代码的必备基础。