在 Java 中,**“不可变性(Immutability)”**通常指:一个对象在创建之后,它的状态(内部数据)不能再被修改。一旦对象被构造出来,它就“永远不变”。
下面从几个层面来理解。
不可变对象:创建后,其字段值不能被改变,且通常:
private finalfinal 的(防止被子类破坏不可变性)StringString s = "abc";
s = s + "d";
这里并不是修改了原来的字符串,而是创建了一个新的 String 对象 "abcd",原来的 "abc" 没变。
public final class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
特点:
final class:不能被继承final 字段:构造后不能改final ≠ 不可变final List<String> list = new ArrayList<>();
list.add("a"); // 可以!
final 只保证引用不变,但对象内容可以变。
public final class Person {
private final Date birthDate;
public Person(Date birthDate) {
this.birthDate = birthDate;
}
public Date getBirthDate() {
return birthDate; // 危险
}
}
调用者可以:
person.getBirthDate().setTime(0);
✅ 正确做法(防御性拷贝):
public Date getBirthDate() {
return new Date(birthDate.getTime());
}
或使用不可变类型(如 LocalDateTime)。
不可变对象天然线程安全,不需要加锁。
“创建后就不会变” → 逻辑更简单。
如 String、包装类:
Map<String, Object> map = new HashMap<>();
如果 key 可变,会导致找不到值。
如 Integer.valueOf(127) 有缓存。
StringBuilderJava 的不可变性不是“不能改引用”,而是“对象创建后内部状态不可变”。
如果你愿意,我也可以:
String / StringBuilder免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。