温馨提示×

温馨提示×

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

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

java immutable有何作用

发布时间:2026-10-01 19:24:30 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 中,immutable(不可变)指的是对象一旦创建,其状态(字段值)就不能再被修改。典型的例子有 String、Integer、LocalDateTime 等。

一、Immutable 的主要作用

1. 线程安全(Thread Safety)

不可变对象天生是线程安全的:

  • 没有写操作,就不会有竞态条件
  • 不需要加锁(synchronized / Lock)
final class Point {
    final int x;
    final int y;
    Point(int x, int y) { this.x = x; this.y = y; }
}

多个线程同时读 Point 对象,不会出问题。

✅ 常用于:并发编程、函数式编程


2. 防止意外修改(安全性)

不可变对象可以避免:

  • 被其他方法偷偷修改
  • 状态不一致
public List<String> getNames() {
    return Collections.unmodifiableList(names);
}

如果不返回 immutable 集合,调用方可能误改内部数据。


3. 可作为 Map / Set 的 Key

不可变对象哈希值稳定,适合做 HashMap 的 key。

Map<String, String> map = new HashMap<>();

如果用可变对象做 key,修改后可能找不到原来的值。


4. 缓存友好 & 性能优化

  • 可安全共享(flyweight 模式)
  • 可复用对象(如 Integer.valueOf(-128~127))
String a = "abc";
String b = "abc"; // 可能复用同一对象

5. 函数式编程 & 可预测性

  • 方法返回值确定
  • 没有副作用
  • 更容易测试和维护

二、如何实现一个 Immutable 类

规则:

  1. 类用 final
  2. 所有字段用 final
  3. 不提供 setter
  4. 构造时完成初始化
  5. 引用类型字段也要不可变或防御性拷贝
public final class User {
    private final String name;
    private final List<String> roles;

    public User(String name, List<String> roles) {
        this.name = name;
        this.roles = List.copyOf(roles); // 防御性拷贝
    }

    public List<String> getRoles() {
        return roles; // 已经是不可变 List
    }
}

三、Immutable 的代价(缺点)

  • 修改状态要创建新对象(轻微性能开销)
  • 频繁修改场景不适合(如大量计算)

四、常见 Immutable 类型(Java)

  • String
  • 包装类:Integer、Long
  • BigDecimal
  • LocalDate / LocalDateTime
  • List.of() / Set.of() / Map.of()

总结一句话

Java 中 immutable 的作用是:用“不能改”来换“安全、简单、并发友好”。

如果你愿意,我也可以讲 mutable vs immutable 的实际案例对比 或 面试常问点。

向AI问一下细节

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

AI
助
手