日期:2014-05-20  浏览次数:20781 次

这种问题有点钻牛角尖,相信想把JAVA学好学透的人都会喜欢。
这种问题有点钻牛角尖,但相信想把JAVA学好学透的人都会喜欢。

Java code
public class Test {
    public static void main(String[] args) {
        Integer i1 = 100;
        Integer i2 = 100;
        if (i1 == i2) {
            System.out.println("i1==i2");
        } else {
            System.out.println("i1!=i2");
        }

        Integer i3 = 200;
        Integer i4 = 200;
        if (i3 == i4) {
            System.out.println("i3==i4");
        } else {
            System.out.println("i3!=i4");
        }
    }
}


结果:
i1==i2
i3!=i4

这是为什么?
答案为白色,选中查看:
[color=#FFFFFF]在用Integer比较的时候是会分两种情况的,当取值在-128~127之间时,是用原生数据类型,也就是int去作比较,除此之外都是用Integer,也就是比较它们的地址,所以才得出了以上的结果![/color]

------解决方案--------------------
package com.test;
public class 解包装包 {
public static void main(String []args) {
Integer a = 100;
Integer b = 100;
System.out.println(a==b);
}
}
打印结果为:true
但是如果换成 128 > var >= -128 之外的整数就打false了。
这是什么原因呢?
1。java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2。比较的时候仍然是对象的比较
3。在jdk源码中
。。。
public static Integer valueOf(int i) { 
final int offset = 128; 
if (i >= -128 && i <= 127) { // must cache 
return IntegerCache.cache[i + offset]; 

return new Integer(i); 

。。。

。。。
private static class IntegerCache { 
private IntegerCache(){} 
static final Integer cache[] = new Integer[-(-128) + 127 + 1]; 
static { 
for(int i = 0; i < cache.length; i++) 
cache = new Integer(i - 128); 


。。。
这边是java为了提高效率,初始化了-128--127之间的整数对象
所以在赋值在这个范围内都是同一个对象。
再加一句
Integer a = 100;
a++;
//这边a++是新创建了一个对象,不是以前的对象。
public static void main(String []args) {
Integer a = 100;
Integer b = a;
a++;
System.out.println(a==b);
}
打印就是false
对于127--128没有多大关系,但是在这范围之外就影响性能了吧,就像StringBuffer VS String一样了

看了这么一篇文章。。。JAVA为什么要这样做呢?

真是学到了。。。
------解决方案--------------------
找到原因了,不能用==,用下面的就可以处理了
 Integer i1 = 100;
Integer i2 = 100;
if (i1.equals(i2)) {
System.out.println("i1==i2");
} else {
System.out.println("i1!=i2");
}

Integer i3 = 200;
Integer i4 = 200;
System.out.println(i3);
System.out.println(i4);
if (i3.equals(i4)) {
System.out.println("i3==i4");
} else {
System.out.println("i3!=i4");
}

------解决方案--------------------
http://topic.csdn.net/u/20090519/18/7b8cf7ef-bc06-4d26-8a2c-692eb0562231.html
我这个帖子的最后有说明
------解决方案--------------------
使用了Facade模式,但弄出太多对象来又不太合适,所以取个常用的范围预先存起来了,
但不知道java为什么不像处理String那样,每创建出一个对象,就放到池里公用。

也许sun经过统计发现字符串重用的可能性高,而整数重用的概率比较低吧。
------解决方案--------------------
看这段代码,你就明白了,当一个int或者Integer型数在[-128,127]之间时,是做过特殊处理的:

Java code
public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }

------解决方案--------------------