java中的Boxing和unboxing

http://www.blogjava.net/badboyryan/archive/2007/06/12/123733.html

最近给替一个朋友出的几道java的面试题,主要是面试java高级工程师,报酬就是晚饭,已经沦落的卖艺的境地。

题目很简单
   Integer i1 = 100;
   Integer i2 = 100;
   Integer i3 = 1000;
   Integer i4 = 1000;
   System.out.println(i1==i2);
   System.out.println(i3==i4);
很遗憾,没有一个答对的,正确答案是
true
false
如果面试者写这样的写是错误的,就算通过。
这个的原因要从java5的Boxing和unboxing谈起,boxing就是封装基本类型的对象,unboxing就是转换对象到基本类型。
Integer, Long, Float, Double, Short, Character etc.都是这样的类型他们是immutable。
Boxing
在jdk1.4.2中,
必须是// Assigning primitive type to wrapper type
   Integer iWrapper = new Integer(10);
java5中
 // Assigning primitive type to wrapper type
   Integer iWrapper = 10;
unboxing
在jdk1.4.2中,
int iPrimitive = iWrapper.intValue();
java5中
int iPrimitive = iWrapper;
下面是基本类型作为对象存储的范围,
boolean values true and false 
All byte values 
short values between -128 and 127 
int values between -128 and 127 
char in the range \u0000 to \u007F 
如果int values between -128 and 127,VM使用相同的对象,否则创建新的对象。
所以这段代码,大家不要奇怪
System.out.println(0L == 0);
System.out.println(((Long)0L).equals(0));
第二行代码是0不等于0
因为大家犯这样的一个错误
 static private final String LOCK = "LOCK";
  void testMethod() {
    synchronized(LOCK) {
    ...
    }
  }

应该用new,不要直接=,对于int,最好使用int a[0] ,因为array也是对象,不像Integer,a[0]的值可以改变。


-----------------看了上述描述之后,回看了Jdk的源码,对于不可变类Integer,

看源码:

public final class Integer 。。。

private final int value;

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

Integer i=10;//这个等同于 Integer i=Integer.valueof(10);

其使用一个内部类IntegerCache缓存了-128-127之间的数据,如果一个数落在这中间,则直接使用保存在栈里面的数据(=同于常量池)

故而有 a==b,而c!=d


同样的如果对String对象上锁,则应该使用new。否则其他地方引用常量池中的Sting对象也被锁掉了!。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值