温馨提示×

温馨提示×

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

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

java不可变机制是什么

发布时间:2026-10-22 08:38:35 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 中,“不可变机制”(Immutability)通常指:一个对象在创建之后,其状态(字段值)不能被修改。一旦对象被构造完成,它就始终保持不变,直到被垃圾回收。

下面从概念、实现方式、原理和典型应用几个方面说明。


一、什么是不可变对象(Immutable Object)

不可变对象满足以下条件:

  1. 类不能被继承(防止子类破坏不可变性)
  2. 所有字段都是 private 和 final
  3. 不提供任何修改状态的方法(setter)
  4. 字段如果是引用类型,也不能被外部修改
  5. 构造过程安全(不会泄露 this)

二、最简单的不可变类示例

public final class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

特点:

  • final class:不能被继承
  • final 字段:赋值后不能改
  • 无 setter
  • String 本身也是不可变的

三、为什么 Java 需要不可变机制

1. 线程安全

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

  • 不需要加锁
  • 多个线程同时读不会出问题
// 多线程共享,不会出问题
private static final Person p = new Person("Tom", 18);

2. 缓存 & 哈希安全

HashMap、HashSet 依赖 hashCode():

  • 如果对象可变,放入集合后改值会导致“找不到”
Map<Person, String> map = new HashMap<>();
map.put(p, "A");
p.setName("Jack"); // 如果可变,map 就坏了

3. 安全性(防止外部篡改)

例如:

  • String
  • Integer
  • BigDecimal

防止:

  • 参数被悄悄修改
  • 系统配置被意外更改

四、Java 中典型的不可变类

类 说明
String 最经典的不可变类
Integer / Long 包装类不可变
BigDecimal 精确计算
LocalDate / LocalDateTime Java 8 时间 API
Optional 容器但不可变

五、String 的不可变机制(重点)

String s = "abc";
s = s + "d";

并不是修改原字符串,而是:

  • 创建新 String
  • 原 String 不变

原因:

  • char[] value 是 private final
  • 没有提供修改方法
  • 字符串常量池依赖不可变性

六、引用类型的“伪不可变”陷阱

public final class Demo {
    private final List<String> list;

    public Demo(List<String> list) {
        this.list = list; // 危险!
    }

    public List<String> getList() {
        return list; // 危险!
    }
}

外部仍可:

demo.getList().add("hack");

✅ 正确做法:

this.list = new ArrayList<>(list);
return Collections.unmodifiableList(list);

七、不可变 ≠ final

常见误区:

final Person p = new Person("Tom", 18);

final 只保证:

  • 引用不能变

不保证:

  • 对象内部状态不变

八、不可变机制的代价

  • 频繁创建对象(如字符串拼接)
  • 可用 StringBuilder 优化

九、总结一句话

Java 的不可变机制,是通过“类封闭 + final 字段 + 无修改方法 + 防御性拷贝”来保证对象创建后状态不可变,从而实现线程安全和数据安全的设计机制。

如果你愿意,我也可以:

  • 对比可变 vs 不可变性能
  • 讲 String 常量池原理
  • 分析面试常问的不可变问题
向AI问一下细节

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

AI
助
手