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类型的 变量又怎么会对象的地址相同呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
a是基本类型int的,在a与b比较时其实Java完成了一个自动解包过程,将Integer的b解包成了int数据,所以这里实际比较的是数字,而不是地址了。详细可以查阅一下自动封包和自动解包。
可以看看这篇博客 http://blog.csdn.net/danielinbiti/article/details/39996065
给你一个不太详细回答(因为不想再捣鼓java了,所以就没细查资料):
首先,int == Integer,这个比较应该是Integer对象发生了自动拆箱,
其实实际是这样比较的:
int == integer.intValue()
也就是说,
跟
编译后的结果是一样的。
你可以找java的反编译工具(比如jad),看看上面两种方式的class文件。
另外,对象跟对象使用 == 比较,确实比较的是地址,所以一般对象之间要比较的话都用equals,但是值类型的比较,比较的是值,所以你的结果就是那样的。
不过,还有一个类似的例子你可以试试:
看看结果。
最后,C sharp 大法好,退java保平安。
一句话:
==会进行隐式的数据类型转换,当两端的数据类型不同的时候会转换成相同的数据类型(优先级的话,看手册吧)。而数据类型只有这么几种:boolean,char,short,int,long,float,double,对象等
因为当你比较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装箱拆箱的源码