一、什么是String的不可变性?
- String的不可变性是Java语言中一个基础但极其重要的概念。简单来说:一旦一个String对象被创建,它的值就永远不能被改变。任何看似"修改"字符串的操作,实际上都是创建了一个全新的String对象。
生活中的类比
- 想象一个刻在石头上的文字:
- 🪨 不可变字符串:就像刻在石头上的字 - 一旦刻上,就不能修改。如果想改变文字,必须换一块新石头重新刻
- 📝 可变字符串:就像写在白板上的字 - 可以随时擦掉重写,还是同一块白板
二、为什么String要设计成不可变?
1. 安全性
想象一个银行系统的账户名:
String accountName = "张三";
如果String是可变的,黑客可能通过修改这个字符串来访问其他账户:
accountName.replace("张", "李"); // 如果可变,会变成"李三"!
由于String不可变,这种攻击不可能发生。
2. 线程安全
多线程环境下,不可变对象天生线程安全:
// 多个线程可以安全共享
public static final String API_KEY = "sk-123456";
不需要任何同步措施,因为值永远不会改变。
3. 哈希值缓存
String常用作HashMap的键:
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 95);
因为String不可变,它的哈希值可以安全缓存:
// String类中的哈希值缓存
private int hash; // 默认为0public int hashCode() {int h = hash;if (h == 0 && !hashIsZero) {// 第