资料来源: http://hi.Baidu.com/eduask/blog/item/227 BF 4d 81 c 71 ebf 538012 f 53.html
package com.test;
公共类测试{
publicstaticvoidmain (string [ ] args ) {
Integer a=100; //如果在这里使用new,则==的值一定为false
Integer b=100;
system.out.println(a==b ); //true
Integer c=150;
Integer d=150;
system.out.println(c==d ); //false
() ) ) ) )。
() ) ) ) )。
打印结果很明显。
但是,如果改为128 var=-128以外的整数,则为false。
这是什么原因?
1。 java在编译时Integer a=100; 翻译为-integera=integer.valueof(100 );
2。 比较时仍然是对象的比较
3。 在jdk源代码中
请参阅。 请参阅。 请参阅。
publicstaticintegervalueof{
final int offset=128;
if(I=-128I=127 ) ) { //must cache
returnintegercache.cache [ I offset ]; 符合//值的范围时,进入制作的静态IntergerCache,i offset的值表示去取cache数组中其下标的值
() ) ) ) )。
returnnewinteger(I; 不属于-128 127的值范围时。 请记住: new,开拓新的内存区域。 不属于智能缓存管理区域
() ) ) ) )。
请参阅。 请参阅。 请参阅。
而且,那是
请参阅。 请参阅。 请参阅。
privatestaticclassintegercache {
私有积分缓存
saticfinalintegercache [ ]=new integer [-128 ] 1271; 开辟-128到127的内存区域。 有0的位置哦
静态{
for(intI=0; i cache.length; I )
che[I]=newinteger(I-128; //为内存区域数组逐个对象赋值
() ) ) ) )。
() ) ) ) )。
请参阅。 请参阅。 请参阅。
这是java为了提高效率,初始化了-128--127之间的整数对象
所以赋值在这个范围内都是同样的对象。
再加一个
Integer a=100;
a;
//这位a是新创建的对手,不是以前的对手。
publicstaticvoidmain (string [ ] args ) {
Integer a=100;
Integer b=a; //此时,作为b指针指示值为100的堆地址的a的堆地址,a==b成立
a; //此时,a指向的值变为101,a指针指向101的堆地址。 baxdjj指着100
system.out.println(a==b );
() ) ) ) )。
打印为假
虽然127--128没有什么关系,但是在这个范围之外会影响性能吧。 就像StringBuffer VS String