今天在了解java中==和equals()方法的异同之时,偶然在ITEye论坛发现一篇文章,看了之后受益匪浅。感谢作者的分享,但由于作者对内容的转载权限做了限制,在此给出文章链接和一些自己的收获供大家学习交流。
《Java迷题:等于,还是不等于?》 Author:xiaoyu1985ban
自动装箱?自动拆箱?
对于Integer数据类型,
对于-128到127的数字,valueOf返回的是缓存中的对象。
#29
补充
java使用该机制是为了达到最小化数据输入和输出的目的,这是一种优化措施,提高效率其他的包装器:
Boolean: (全部缓存)
Byte:
(全部缓存)
具体情况可以参照英文原版的JDK帮助文档。
1,片段一:
Integer a = new Integer(100);
Integer b = 100;
前者对象构建在堆上(new),后者对象由编译器自动封装,所以二者是两个不同对象;
前者对象构建在堆上(new),后者对象由编译器自动封装,所以二者是两个不同对象;
2,片段二:
3,片段三:
Integer a = 156;
Integer b = 156;
同2,由编译器自动包装,但不使用缓存IntegerCache(因为156>127),所以是两个不同的对象;
同2,由编译器自动包装,但不使用缓存IntegerCache(因为156>127),所以是两个不同的对象;
4,
片段四:
Integer a =Integer.valueOf(100);
Integer b = 100;
valueOf会优先使用缓存,而编译器自动包装也会使用缓存,并且100<=127在缓存的范围内,所以二者是同一个对象。
valueOf会优先使用缓存,而编译器自动包装也会使用缓存,并且100<=127在缓存的范围内,所以二者是同一个对象。
测试代码及运行结果
//Author:BonJean
//understand the sign == and the function equals()
//2014.07.25
//packagepackage_02;
publicclass Compare {
publicstatic void main(final String[] args) {
//TODO Auto-generated method stub
//test== int
inta=new Integer(101);
intb=101;
System.out.println(a==b);
System.out.println(a);
System.out.println(b);
System.out.println("------------");
//test== Integer
//Integerc=new Integer(100);
Integerx=new Integer(100);
Integery=100;
System.out.println(x==y);
System.out.println(x);
System.out.println(y);
System.out.println("------------");
//testInteger
Integerc=123;
Integerd=123;
System.out.println(c==d);
System.out.println(c);
System.out.println(d);
System.out.println("------------");
//test== Integer again
Integere=127;
Integerf=127;
System.out.println(e==f);
System.out.println(e);
System.out.println(f);
System.out.println("------------");
//testInteger again again
Integerg=Integer.valueOf(156);
Integerh=156;
System.out.println(g==h);
System.out.println(g);
System.out.println(h);
System.out.println("------------");
}
}
运行结果:
ture
101
101
------------
false
100
100
------------
true
123
123
------------
true
127
127
------------
false
156
156
------------
ture
101
101
------------
false
100
100
------------
true
123
123
------------
true
127
127
------------
false
156
156
------------
参考文献
[1]《
Java迷题:等于,还是不等于?》
/**
*站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
*/