在 Java 中,不可变性(Immutability)是一个非常核心但又容易被误解的概念。下面我从定义、实现方式、常见误区、优点和典型应用几个方面来帮你系统理解。
不可变对象(Immutable Object):
一旦对象被创建,它的状态(字段值)就不能再被修改。
换句话说:
String s = "hello";
s = s + " world"; // 实际上创建了一个新的 String 对象
在 Java 中,要让一个类“真正不可变”,通常要满足以下条件:
final 修饰(防止被继承)public final class Person {
}
private final 修饰private final String name;
private final int age;
// 没有 setName / setAge
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private final List<String> hobbies;
public Person(List<String> hobbies) {
this.hobbies = new ArrayList<>(hobbies); // 防御拷贝
}
public List<String> getHobbies() {
return new ArrayList<>(hobbies); // 防止外部修改
}
✅ 这样才是真正不可变
final 就等于不可变final List<String> list = new ArrayList<>();
list.add("a"); // 可以修改!
final 只保证引用不变,不保证内容不变
finalString 不可变是因为:
private final不需要加锁,多个线程同时读不会出问题
例如 String 常量池、Integer 缓存
不用担心对象被悄悄改了
Map<String, Object> map = new HashMap<>();
如果 key 可变,会导致找不到值
| 类 | 说明 |
|---|---|
String |
最经典的不可变类 |
Integer / Long |
包装类不可变 |
BigDecimal |
精确计算 |
LocalDate / LocalDateTime |
Java 8 时间 API |
Optional |
函数式编程 |
虽然“修改要新建对象”,但:
Java 的不可变性,不是“不能改引用”,而是“对象创建后状态不可变”。
如果你愿意,我也可以:
你想从哪个角度再深入?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。