在 Java 中,String 被设计为不可变(immutable),主要原因可以从设计实现和设计目的两个层面来理解。
String 不可变String 类被 final 修饰public final class String
在 JDK 8 及之前:
private final char value[];
在 JDK 9 及之后:
private final byte[] value[];
value 是 private 的final(引用不可变)例如:
String s = "abc";
s = s.concat("def");
concat、substring、replace 等都不会修改原字符串String 对象String a = "abc";
String b = "abc";
a 和 b 指向同一个对象String 可变,修改 a 会影响 b✅ 不可变才能保证安全共享
String 不需要同步Map<String, Object> map = new HashMap<>();
map.put("key", value);
String 可变,key 改变会导致:
✅ 不可变保证 hash 稳定
例如:
String filePath = "/home/user/file.txt";
String 可变,可能在权限校验后被偷偷修改private int hash; // 默认 0
String 会缓存 hashCodefinal char[] arr = {'a','b'};
arr[0] = 'c'; // 合法
final 只保证引用不变理论上可以通过反射改 value 数组,但:
Java 的
String不可变,是为了安全、性能、线程安全和字符串池共享,而通过final类 + 私有不可变数组 + 无修改方法共同实现的。
如果你愿意,我也可以讲:
StringBuilder / StringBuffer 为什么可变substring 在 JDK 6 和 JDK 8 的内存区别char[] 改成 byte[]免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。