在 Java 中,Integer 是不可变(immutable)的,核心原因可以归结为设计目标、安全性、性能优化(缓存)以及并发友好性。下面分点说明。
Integer 一旦被创建,它包装的 int 值就不能再被修改。
例如:
Integer a = 10;
a = 20; // 不是修改原对象,而是让 a 指向新的 Integer 对象
Integer 内部大致是这样(简化):
public final class Integer {
private final int value;
public Integer(int value) {
this.value = value;
}
}
final class:不能被继承private final int value:值不可改不可变对象:
Integer count = 0;
// 多线程同时“修改”时,其实是创建新对象,不会相互影响
Integer 常被用作:
Map<Integer, String> map = new HashMap<>();
如果 Integer 可变:
hashCode() 变不可变保证了:
hashCode() 永远不变Java 对 -128 ~ 127 的 Integer 做了缓存:
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true
如果 Integer 可变:
a 会影响 b如果 Integer 可变:
Integer x = new Integer(10);
Integer y = x;
y.setValue(20); // 如果允许
// x 也变了,非常危险
不可变避免了这种隐式修改。
基本类型 int 本身是“值传递”的:
void test(int x) { x = 100; }
Integer 作为包装类,保持类似的语义,避免混淆。
Integer i = 1;
i++;
其实是:
i = Integer.valueOf(i.intValue() + 1);
✅ 创建新对象
❌ 没改原对象
AtomicInteger 是可变的?如果你真的需要可变整数:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
这是专门为并发计数设计的类,和 Integer 的定位不同。
Integer不可变,是为了安全、稳定、可缓存、线程友好,并符合 Java 对值类型包装类的设计哲学。
如果你愿意,我也可以讲:
Integer 缓存源码Integer vs int 面试常问点String 也是不可变的免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。