String 为什么是不可变的?
发布于
一、不可变的体现
String 内部用 final char[](JDK 9 后是 byte[])存储字符,且没有提供修改内部数组的方法,一旦创建内容就不能改。所谓"修改"其实是创建新对象。
二、设计原因
- 字符串常量池复用:相同字面量共享同一对象,节省内存。
- 线程安全:不可变对象天然线程安全,多线程下无需同步。
- hashCode 缓存:String 的 hashCode 在首次计算后缓存,作为 HashMap 键时性能稳定。
- 安全性:作为参数传递时不会被意外篡改,如数据库连接串、文件名。
三、注意事项
String s = "hello";
s += " world"; // 不是修改原对象,而是新建 "hello world"
频繁拼接字符串会产生大量临时对象,应使用 StringBuilder。