首页 > 关于java的==的疑问

关于java的==的疑问

         int a = 0;
         Integer b = new Integer(0);
         Integer c = new Integer(0);
         System.out.println("a==b:"+(a == b));
         System.out.println("a==c:"+(a == c));
         System.out.println("b==c:"+(b == c));

输出的结果如下:
a==b:true
a==c:true
b==c:false

==应该判断对象的地址相同嘛。如果a和b相同 a和c相同,而b和c却不同是什么情况呢?
int类型的a 和Integer类型的 变量又怎么会对象的地址相同呢?


不是拆箱,是因为Integer有缓存,它缓存了-128~127之间的数据

a 是基本类型 int 的,在 ab 比较时其实 Java 完成了一个自动解包过程,将 Integerb 解包成了 int 数据,所以这里实际比较的是数字,而不是地址了。

详细可以查阅一下自动封包和自动解包。


因为当你比较a==c,或者a==b的时候,Java帮你完成了一个自动拆箱的过程,因此实际上是两个int类型的比较。由于int是基本类型,因此使用==操作符比较的话返回true。

而当比较b==c的时候,比较的是两个Integer对象,使用==操作符比较对象的时候,其实比较的是引用,b和c是两个实例,所以返回false。


"b==c:"false,这个是肯定的,2个对象都是new的,地址肯定不一样

a==b ,a==c true,由于a是int数据型的,看看下integer装箱拆箱的源码

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

一句话:==会进行隐式的数据类型转换,当两端的数据类型不同的时候会转换成相同的数据类型(优先级的话,看手册吧)。
而数据类型只有这么几种:boolean,char,short,int,long,float,double,对象等


可以看看这篇博客 http://blog.csdn.net/danielinbiti/article/details/39996065


给你一个不太详细回答(因为不想再捣鼓java了,所以就没细查资料):

首先,int == Integer,这个比较应该是Integer对象发生了自动拆箱,
其实实际是这样比较的:
int == integer.intValue()

也就是说,

System.out.println("a==b:"+(a == b));

System.out.println("a==b:"+(a == b.intValue()));

编译后的结果是一样的。

你可以找java的反编译工具(比如jad),看看上面两种方式的class文件。

另外,对象跟对象使用 == 比较,确实比较的是地址,所以一般对象之间要比较的话都用equals,但是值类型的比较,比较的是值,所以你的结果就是那样的。

不过,还有一个类似的例子你可以试试:

Integer d = 127;
Integer e = 127;
System.out.println(d == e);

Integer g = 128;
Integer h = 128;
System.out.println(g == h);

看看结果。

最后,C sharp 大法好,退java保平安。

【热门文章】
【热门文章】