Java基础的128陷阱
package com.qcby;public class Main {public static void main(String[] args) {Integer a = 100;Integer b = 100;System.out.println(a == b);a = 1000;b = 1000;System.out.println(a == b);}
}
当运行这个代码之后第一个输出为true,第二个输出为false
这是因为超出了范围导致输出为false,也就是128陷阱
128陷阱:数值在-128-127之间的数值都存储在有一个catch数组中,当该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在数组当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等
根据Integer.java源码中的内容可以更好的理解
Integer里面有一个valueOf的方法,当在low和high的范围中就会返回这个内容,但是不在这个范围内就会返回一个new的Integer
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
在图片中可以看到low=-128,high=127,也就是说当在-128—127之间就会返回true,其余值就会返回false