下面是一个关于Integer比较有意思的现象:
public class IntegerTest { public static void main(String[] args) { Integer num1 = 1000, num2 = 1000; System.out.println(num1 == num2);//false num1 = 100; num2 = 100; System.out.println(num1 == num2);//true } }为了了解这个现象的真相,首先看一下字节码层面:
通过字节码知道了Integer的直接赋值是调用了Integer类的静态方法 valueOf(),下面我们看一下这个方法都做了什么。
如果i大于IntegerCache.low并且i小于IntegerCache.high,那么就返回IntegerCache.cache[i + (-IntegerCache.low)],否则就返回一个值为new Integer(i)。
再看一下IntegerCache是什么?是Integer的一个内部私有类,仔细读会发现这里做了个缓存,缓存了-128~127之间的所有整数。
也就是如果Integer直接赋值,赋值为-128~127之间的整数,那么是直接从Integer的内部类的缓存中直接读取,然后返回,所以指向的为同一个对象,所以==的判断为true。