对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产 生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数 据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。
以下是Java中Integer
缓存机制的一个示例代码,它演示了在-128至127范围内和范围外的Integer
对象的比较行为:
public class IntegerCacheExample { public static void main(String[] args) { // 在-128至127范围内的赋值 Integer a = 127; Integer b = 127; // 在-128至127范围外的赋值 Integer c = 128; Integer d = 128; // 使用==进行比较 System.out.println("a == b: " + (a == b)); // true,因为a和b引用的是同一个缓存对象 System.out.println("c == d: " + (c == d)); // false,因为c和d引用的是不同的堆对象 // 使用equals方法进行比较 System.out.println("a.equals(b): " + a.equals(b)); // true,因为a和b的值相等 System.out.println("c.equals(d): " + c.equals(d)); // true,因为c和d的值相等 } }
输出结果:
a == b: true c == d: false a.equals(b): true c.equals(d): true
在这个例子中,a
和b
的值都在-128至127的范围内,所以它们引用的是同一个缓存对象,因此a == b
的结果为true
。而c
和d
的值超出了这个范围,所以它们在堆上创建了新的对象,因此c == d
的结果为false
。
尽管a
和b
引用的是同一个对象,但它们的值相等,所以a.equals(b)
的结果为true
。同样,尽管c
和d
引用的是不同的对象,但它们的值相等,所以c.equals(d)
的结果也为true
。
因此,在比较Integer
对象时,推荐使用equals
方法,以避免由于缓存机制导致的潜在错误。