关于java的==的疑问

 int a = 0; Integer b = new Integer0; Integer c = new Integer0; 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类型的 变量又怎么会对象的地址相同呢?

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

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

可以看看这篇博客 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.printlnd == e; Integer g = 128;
Integer h = 128;
System.out.printlng == h;

看看结果。

最后,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装箱拆箱的源码

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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注