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
的,在 a
与 b
比较时其实 Java
完成了一个自动解包过程,将 Integer
的 b
解包成了 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保平安。