Java 字符串
字符串不可变性
Java 中的字符串是不可变的(immutable),即一旦创建,字符串对象的内容就不能被修改。每当对字符串进行任何操作(如拼接、替换、截取等)时,都会创建一个新的字符串对象,而不会改变原有的字符串。 这种不可变性保证了字符串的安全性和线程安全,但频繁的字符串操作会导致大量新对象的创建,影响性能。
字符串常量池
Java 中的字符串常量池(String Constant Pool)是一个特殊的内存区域,用于存储字符串字面量。它的主要目的是为了节省内存和提高性能
NOTE
字符串字面量自动进入常量池. 在 Java 中,字符串字面量在编译时就会自动被放入字符串常量池
字符串常量折叠
编译器会在编译期间自动计算和合并字符串常量表达式。
java
// 编译后,`s` 实际上就是 `"helloworld"`,而不是运行时才拼接。
String s = "hello" + "world";
NOTE
只有全部参与拼接的部分都是常量时,才会发生折叠。
字符串常量传播
如果一个字符串变量的值在编译期已知,编译器会直接用常量替换变量引用。
java
final String a = "foo";
String b = a + "bar"; // 编译期优化为 "foobar"
String a = "foo";
String b = a + "bar"; // 运行时拼接