温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

为何String是不可变的

发布时间:2026-07-16 10:12:48 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 中,String 被设计为不可变(immutable),主要有以下几个核心原因:


一、什么是不可变?

不可变指的是:
一旦一个 String 对象被创建,它的值就不能再被修改。
任何看似“修改”字符串的操作(如拼接、替换),实际上都会创建一个新的 String 对象

String s = "abc";
s = s + "d"; // 实际创建了一个新的 String 对象

二、为什么 String 设计为不可变?

1️⃣ 字符串常量池的需要(节省内存)

Java 为了提高性能,设计了 字符串常量池(String Pool)

String a = "abc";
String b = "abc";

如果 String 是可变的:

  • 修改 a 会影响 b
  • 常量池就无法安全地共享对象

不可变特性保证了字符串可以安全地共享


2️⃣ 安全性(Security)

字符串广泛用于:

  • 类名加载(Class.forName("xxx")
  • 网络连接
  • 文件路径
  • 数据库 URL、密码等

如果 String 可变:

String password = "123456";
change(password); // 如果可变,可能被篡改

不可变防止被意外或恶意修改


3️⃣ 线程安全(Thread Safety)

不可变对象天然是线程安全的:

  • 不需要加锁
  • 多个线程同时访问同一个字符串对象不会出问题
String s = "hello";
// 多线程访问 s 是安全的

4️⃣ 哈希码缓存(性能优化)

String 经常作为 HashMap 的 key:

map.put("name", "Tom");

String 内部缓存了 hash 值:

private int hash; // 缓存哈希值

如果字符串可变:

  • 修改后 hash 会变
  • HashMap 会失效

不可变保证了 hash 值稳定,提高性能


5️⃣ 设计简单、稳定

不可变对象:

  • 状态固定
  • 更容易推理
  • 更容易设计 API

三、String 不可变是如何实现的?

1️⃣ final

public final class String

防止被继承,避免被子类破坏不可变性。


2️⃣ final char[] / byte[]

(JDK 9 之后是 byte[]

private final byte[] value;
  • valuefinal
  • 没有提供修改它的方法

3️⃣ 不对外暴露修改方法

所有看似修改的方法,都返回新对象:

String s2 = s1.substring(0, 3);
String s3 = s1.concat("xyz");

四、那为什么还需要 StringBuilder / StringBuffer

因为频繁修改字符串时:

String s = "";
for (int i = 0; i < 10000; i++) {
    s += i; // 每次都创建新对象,性能差
}

✅ 使用可变字符串:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append(i);
}

五、总结一句话

String 设计为不可变,是为了安全、性能、线程安全和字符串共享。

如果你愿意,我也可以从
✅ JVM 层面
✅ 面试角度
✅ 与 StringBuilder 的对比
来进一步讲解。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI