------- android培训、java培训、期待与您交流! ----------
在黑马论坛上看到这样一道题:判断最终结果是true还是false。
代码片段1
Java代码
public static void main(final String[] args) {
Integer a = new Integer(100);
Integer b = 100;
System.out.println(a == b);
代码片段2
Java代码
public static void main(final String[] args) {
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
代码片段3
Java代码
public static void main(final String[] args) {
Integer a = 156;
Integer b = 156;
System.out.println(a == b);
}
代码片段4
Java代码
public static void main(final String[] args) {
Integer a = Integer.valueOf(100);
Integer b = 100;
System.out.println(a == b);
}
一开始我通过网上查找资料,得出了答案。
代码片段1 是false
代码片段2是true。
代码片段3 是false
代码片段4 为true
后来看视频到基本数据类型包装新特性后才发现自己一开始,想的还是有些浅显了,虽然答案都是对的,但理解的并不深入。问题涉及到了好几个知识点,首先是
==是比较的两边是否指向同一个对象,其次Integer a=100其实就相当于
Integer a = new Integer(100),因为1.5出的新特性自动加包,直接将100封装为了对象,
所以Integer a = 100;和Integer b = 100;其实也应该相当于两个对象,之所以a,b指向了同一个对象,是因为java为了提高效率,初始化了-128--127之间的整数对象,所以在赋值
在这个范围内都是同一个对象。
当数值超过后就是代码3的情况了:
Integer a = 156; 等效于Integera = new Integer(150);
Integer b = 156; 等效于Integer a = new Integer(150);
所向指向的是两个对象。
而代码4,等效于代码2,Integer a = Integer.valueOf(100);相当于Integer a = 100在经过编译后的状态