在 Java 中,字符串(String)是不可变的(immutable),也就是说,一旦一个 String 对象被创建,它的值就不能被修改。下面从设计原因、实现机制、以及带来的好处几个方面来解释“为什么”。
String s = "abc";
s = s + "d";
看起来 s 变了,但实际上:
"abc" 对象没有变s + "d" 创建了一个新的 String 对象 "abcd"s 只是重新指向了新对象Java 为了节省内存,使用了字符串常量池:
String a = "abc";
String b = "abc";
a 和 b 指向的是同一个对象。
如果 String 可变:
a 会影响 b✅ 不可变保证了共享安全
不可变对象:
String s = "hello";
多个线程同时读取 s,不会出现数据不一致问题。
String 经常用作 HashMap 的 key:
Map<String, Object> map = new HashMap<>();
hashCode() 只需要计算一次并缓存✅ 不可变保证了哈希一致性
很多底层 API 都使用 String:
如果 String 可变,可能会被恶意修改,造成安全问题。
JVM 在加载类时:
Class.forName("com.example.Test")
类名必须是稳定、不可变的。
public final class String
implements Serializable, Comparable<String>, CharSequence {
private final char value[];
}
final class:不能被继承final value[]:引用不能变例如:
substring()
concat()
replace()
toUpperCase()
都会创建新 String
因为频繁修改字符串时:
所以 Java 提供:
StringBuilder(非线程安全,快)StringBuffer(线程安全,慢)StringBuilder sb = new StringBuilder();
sb.append("a").append("b");
Java 把 String 设计成不可变,是为了安全性、线程安全、字符串池复用和哈希稳定性,是一种“用空间换安全与稳定”的设计。
如果你愿意,我也可以从JVM 内存模型或源码层面再深入讲一点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。