在 Java 里说“不可变(Immutable)”,通常是指:
对象一旦被创建,它的状态(字段值)就不能再被修改。
下面从定义、特征、示例、实现方式、常见误解几个方面系统说明。
不可变对象(Immutable Object):
✅ 例如:String、Integer、LocalDate
String s = "abc";
s = s.concat("def"); // 返回的是一个新的 String
final String s = "abc";
s = "def"; // ❌ 编译错误
final 只是变量不可再指向别的对象✅ 不可变 ≠ final 变量
class User {
private int age;
public User(int age) {
this.age = age;
}
public void setAge(int age) {
this.age = age; // 可变
}
}
❌ 这是一个可变对象
一个标准的不可变对象:
public final class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
}
✅ 无 setter
✅ 字段 final
✅ 类 final
public final class String {
private final char value[];
}
String 是 finalvalue[] 是 finalString✅ 所以 String 是不可变对象
final List<String> list = new ArrayList<>();
list.add("a"); // ✅ 合法
list 不能再指向别的对象ArrayList 内容可变❌ 这不是不可变对象
List<String> list = List.of("a", "b");
list.add("c"); // ❌ 运行时异常
✅ List.of() 返回的是不可变集合
Integer a = 100;
Integer b = 100;
a == b; // true(缓存)
“不可变就是完全不能改”
✅ 正确理解:
BigDecimal a = new BigDecimal("10");
BigDecimal b = a.add(new BigDecimal("5"));
✅ 适合:
❌ 不适合:
Java 的“不可变”指的是:对象一旦创建,其内部状态就永远不会改变,任何修改都会产生新对象。
如果你愿意,我也可以:
String vs StringBuilderList.of、Map.of)免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。