在 Java 中,String 被设计为不可变(immutable),主要有以下几个核心原因:
不可变指的是:
一旦一个 String 对象被创建,它的值就不能再被修改。
任何看似“修改”字符串的操作(如拼接、替换),实际上都会创建一个新的 String 对象。
String s = "abc";
s = s + "d"; // 实际创建了一个新的 String 对象
Java 为了提高性能,设计了 字符串常量池(String Pool):
String a = "abc";
String b = "abc";
如果 String 是可变的:
a 会影响 b✅ 不可变特性保证了字符串可以安全地共享
字符串广泛用于:
Class.forName("xxx"))如果 String 可变:
String password = "123456";
change(password); // 如果可变,可能被篡改
✅ 不可变防止被意外或恶意修改
不可变对象天然是线程安全的:
String s = "hello";
// 多线程访问 s 是安全的
String 经常作为 HashMap 的 key:
map.put("name", "Tom");
String 内部缓存了 hash 值:
private int hash; // 缓存哈希值
如果字符串可变:
✅ 不可变保证了 hash 值稳定,提高性能
不可变对象:
final 类public final class String
防止被继承,避免被子类破坏不可变性。
final char[] / byte[](JDK 9 之后是 byte[])
private final byte[] value;
value 是 final所有看似修改的方法,都返回新对象:
String s2 = s1.substring(0, 3);
String s3 = s1.concat("xyz");
StringBuilder / StringBuffer?因为频繁修改字符串时:
String s = "";
for (int i = 0; i < 10000; i++) {
s += i; // 每次都创建新对象,性能差
}
✅ 使用可变字符串:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
String 设计为不可变,是为了安全、性能、线程安全和字符串共享。
如果你愿意,我也可以从
✅ JVM 层面
✅ 面试角度
✅ 与 StringBuilder 的对比
来进一步讲解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。