温馨提示×

温馨提示×

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

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

为何java整数不可变

发布时间:2026-09-11 07:34:12 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,**“整数不可变”**通常指 Integer(以及 int 的包装类)是不可变类(immutable)。准确地说:

  • int 是基本类型,本身谈不上是“可变/不可变”,只是值类型;
  • Integer 是对象,它被设计为不可变类,一旦创建,其值不能改变。

下面从原因和设计角度解释。


一、什么是“不可变”

Integer 不可变的意思是:

Integer a = 10;
a = 20; // 不是修改原对象,而是让 a 指向新的 Integer 对象

无法修改一个已存在的 Integer 对象内部的值


二、为什么 Java 把 Integer 设计成不可变

1️⃣ 保证线程安全(最重要原因)

不可变对象:

  • 一旦创建,状态不会改变
  • 多线程共享时不需要加锁
Integer count = 0;
// 多线程读 count 是安全的

如果 Integer 可变,多线程修改同一个 Integer 就需要同步,代价很高。


2️⃣ 支持常量池(Integer Cache)

Java 对 Integer 做了缓存:

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true

这依赖于:

  • Integer 值不可变
  • 可以安全共享同一个对象

如果可变,缓存就会导致严重 Bug。


3️⃣ 可作为 HashMap / HashSet 的 Key

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

如果 Integer 可变:

  • 修改 key 的值
  • hashCode() 变化
  • 对象“找不到”了

不可变才能保证:

  • hashCode 稳定
  • 集合行为正确

4️⃣ 简化设计与语义清晰

不可变对象:

  • 没有 setter
  • 没有状态变更方法
  • 更容易理解和推理
public final class Integer {
    private final int value;
}

三、Integer 为什么不可变(源码角度)

简化版 Integer 源码逻辑:

public final class Integer {
    private final int value;

    public Integer(int value) {
        this.value = value;
    }

    public int intValue() {
        return value;
    }
}

关键点:

  • final class:不能被继承
  • private final value:值不能改
  • 没有提供修改方法

四、常见误区

❌ 误区 1:a = 20 是修改对象

Integer a = 10;
a = 20;

✅ 实际是:

  • 创建新 Integer(20)
  • a 指向新对象

❌ 误区 2:Integer 和 int 一样可变

  • int:值类型,复制值
  • Integer:对象引用,值不可变

五、总结一句话

Java 中 Integer 不可变,是为了线程安全、缓存共享、集合安全和设计简洁。

如果你愿意,我也可以对比:

  • Integer vs AtomicInteger
  • 不可变类如何手写
  • 为什么 String 也是不可变的
向AI问一下细节

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

AI