一、观察如下代码
Integer a = 123;
Integer b = 123;
System.out.println(a==b);//结果为True
显而易见结果为true,那么再思考以下代码结果如何?
Integer a1 = 129;
Integer b1 = 129;
System.out.println(a1==b1);//结果为false
这次的结果出乎意料,变成了false!你会想123能等于123,那为什么129等于129的时候就返回false呢?下面我们就从源码的角度分析下:
Integer提供了Integer valueOf(int i)方法:
在Integer valueOf(int i)方法中设置了一个cache数组。通常,IntegerCache.low=-128,IntegerCache.high=127
(除非显示声明java.lang.Integer.IntegerCache.high的值),
Integer中有一段动态代码块,该部分内容会在Integer类被加载的时候就执行。
那我们又是怎么知道IntegerCache.low=-128,IntegerCache.high=127的呢?我们接着看IntegerCache中截取的源码分析:
结果显而易见!
二、总结
Integer提供了Integer.valueOf方法,查看源码我们会发现里面设置了一个缓存数组cache(取值范围为-128到127),一旦超出范围就会new一个新对象!地址改变,结果返回false!