2

昨晚与一同事聊天,他正在找工作,让我问他点常见面试题,然后发现他对Integer, Long, BigDecimal的实现原理不是太清楚,他错误地以为只要不超过范围(-128 ~ 127)的两个对象就能用==进行比较,但其实并不是这样的;

这里先上一个例子:
public static void main(String[] args) {

            int test = 3;
            Integer intA = new Integer(3);
            Integer intB = new Integer(3);
            Integer intC = 2 + 1;
            Integer intD = 52 -49;
            Integer intE = 3;
            Integer intF = test;

            System.out.println(intA == intB);
            System.out.println(intA == intC);
            System.out.println(intC == intB);
            System.out.println(intC == intD);
            System.out.println(intC == intE);
            System.out.println(intD == intE);
            System.out.println(intD == intF);

}
运行结果如下:
false
false
false
true
true
true
true
下面说一下,原理实现
Integer 内部有一个静态变量池 IntegerCache, 存放了一个数组Integer[], -128 ~ 127;
普通的两个值运算都会进行自动拆箱,再进行自动装箱,自动装箱使用的是valueOf方法,Integer.valueOf方法在实现时如果不超过范围(-128 ~ 127)则从 IntegerCache 中获取缓存的Integer对象; 如果超过范围则是new 一个新Integer对象

从IntegerCache池子中取到的对象同一个因此可以用 == 进行比较, 例如:
Integer intD = 52 -49;
Integer intE = 3;
这两个都是从IntegerCachek中取的同一个对象,因此可以进行 == 比较;

而使用构造函数的,则不会从IntegerCache中取, 例如
Integer intA = new Integer(3);
Integer intB = new Integer(3);
他是两个新的Integer对象,尽管value也是在-128~127之间,但并不是从静态变量池 IntegerCache中取的,因此,此时如果用 == 判断则为false;

总结:
两个条件都满足的情况下才可以用 == 判断两个Integer对象是否相等
1.值在-128~127之间
2.比较的两个对象都是使用valueOf创建出来的,或者通过数学计算后自动装箱(valueOf)得来的


从09年开始
3 声望0 粉丝