字符串
Java 字符串详解:String、StringBuilder 与 StringBuffer
字符串是 Java 中最常用的数据类型之一,Java 提供了 String、StringBuilder 和 StringBuffer 三个类用于处理字符串,但它们的特性和适用场景有显著差异。本文将深入解析这三个类的底层实现、核心特性及最佳实践。
String 类:不可变的字符串
String 类是 Java 中最基础的字符串类,其核心特性是不可变性,这一特性深刻影响了它的使用方式和性能表现。
不可变性的底层实现
String 类被 final 修饰,且其底层存储字符的数组 value 也被 final 修饰,因此字符串对象一旦创建,其内容不可修改。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[]; // 存储字符串的字符数组(final修饰)
// ... 其他代码
}
不可变性的含义:字符串的任何修改操作(如拼接、替换)都会创建新的String对象,原对象内容保持不变。
String s = "hello"; s += " world"; // 生成新对象"hello world",原对象"hello"仍存在
字符串常量池:优化内存占用
为减少重复字符串的内存消耗,Java 引入了字符串常量池(位于方法区),用于存储编译期确定的字符串常量。
两种创建字符串的方式对比:
| 创建方式 | 原理 | 示例 |
|---|---|---|
| 直接赋值(字面量) | 优先从常量池查找,若存在则返回引用;否则创建常量并放入池,再返回引用。 | String s = "abc"; |
new String() 构造器 |
始终在堆中创建新对象,若常量池无对应常量则同时创建并放入池。 | String s = new String("abc"); |