String 为什么是不可变的?

发布于

一、不可变的体现

String 内部用 final char[](JDK 9 后是 byte[])存储字符,且没有提供修改内部数组的方法,一旦创建内容就不能改。所谓"修改"其实是创建新对象。

二、设计原因

  1. 字符串常量池复用:相同字面量共享同一对象,节省内存。
  2. 线程安全:不可变对象天然线程安全,多线程下无需同步。
  3. hashCode 缓存:String 的 hashCode 在首次计算后缓存,作为 HashMap 键时性能稳定。
  4. 安全性:作为参数传递时不会被意外篡改,如数据库连接串、文件名。

三、注意事项

String s = "hello";
s += " world";   // 不是修改原对象,而是新建 "hello world"

频繁拼接字符串会产生大量临时对象,应使用 StringBuilder。