java谜题之等或不等

今天在了解java中==和equals()方法的异同之时,偶然在ITEye论坛发现一篇文章,看了之后受益匪浅。感谢作者的分享,但由于作者对内容的转载权限做了限制,在此给出文章链接和一些自己的收获供大家学习交流。
Java迷题:等于,还是不等于?》     Author:xiaoyu1985ban
 
自动装箱?自动拆箱?
对于Integer数据类型, 对于-128到127的数字,valueOf返回的是缓存中的对象。
 
#29  补充
java使用该机制是为了达到最小化数据输入和输出的目的,这是一种优化措施,提高效率其他的包装器:
                      Boolean: (全部缓存)
                      Byte:      (全部缓存)
     Character(    <=127 缓存)
                      Short        (-128~127 缓存)
                      Long          (-128~127 缓存)
     Float        (没有缓存)
                      Doulbe      (没有缓存)
具体情况可以参照英文原版的JDK帮助文档。
 
  #12对文章中的程序做了解释
1,片段一:
       Integer a = new Integer(100); 
       Integer b = 100;
前者对象构建在堆上(new),后者对象由编译器自动封装,所以二者是两个不同对象;
2,片段二:
  Integer a =100; 
              Integer b = 100; 
    由编译器自动包装成对象,编译器自动包装也会使用缓存,且由于100<=127,使用的是IntegerCache,所以二者是同一个对象;
3,片段三:
              Integer a = 156; 
              Integer b = 156; 
同2,由编译器自动包装,但不使用缓存IntegerCache(因为156>127),所以是两个不同的对象;
4,  片段四:
Integer a =Integer.valueOf(100); 
            Integer b = 100; 
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
------------

参考文献

/**
 *站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值