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