在 Java 中,字符串(String)不可变(immutable),主要由设计、实现和安全等多方面原因决定。下面从“是什么、为什么、怎么实现、带来的影响”四个角度说明。
一旦一个 String 对象被创建,它的内容就不能被修改。
String s = "abc";
s = "def"; // 不是修改原对象,而是让 s 指向新的 String 对象
任何“看起来修改”的操作(如 concat、substring、replace)都返回新的 String 对象。
Java 为了节省内存,使用字符串常量池复用相同内容的字符串:
String a = "abc";
String b = "abc";
// a 和 b 指向同一个对象
如果字符串可变:
a 会影响 b✅ 不可变才能保证池安全
字符串广泛用于:
例如:
String username = "admin";
// 传给系统验证
如果可变:
✅ 不可变防止被意外或恶意篡改
不可变对象:
String s = "hello";
// 多线程共享 s 是安全的
✅ 避免并发修改问题
String 常用作 HashMap 的 key:
map.put("key", value);
hashCode() 可缓存✅ 不可变支持高效哈希使用
JVM 加载类时依赖字符串表示类名:
java.lang.String
如果字符串可变,类加载会极不安全。
final classpublic final class String
➡ 不能被继承,防止子类破坏不可变性
private final char[](JDK 8 及以前)private final char value[];
final:引用不可变private:外部无法直接修改setCharAt()byte[] + 编码标识String s = "";
for (int i = 0; i < 10000; i++) {
s += i; // 每次都新建对象
}
StringBuilder(非线程安全,快)StringBuffer(线程安全,慢)StringBuilder sb = new StringBuilder();
sb.append("a").append("b");
String result = sb.toString();
Java 字符串不可变,是为了安全性、性能、线程安全和字符串池机制,是语言层面的刻意设计,而不是限制。
如果你愿意,我也可以:
String / StringBuilder免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。