数值包装类的实现原理

一,案例情景

     

/** Integer案例**/
      Integer i1 = 128;
      Integer i2 = 128;
      Integer i3 = 127;
      Integer i4 = 127;
      System.out.println(i1 == i2);//false
      System.out.println(i3==i4); //true

  

/** Long案例**/
      Long l1 = 128L;
      Long l2 = 128L;
      Long l3 = -128L;
      Long l4 = -128L;
      System.out.println(l1 == l2);//false
      System.out.println(l3==l4);//true

   

/**Float(Double)案例(形成对比)**/
     Float f1 = 128f;
     Float f2 = 128f;
     Float f3 = 127f;
     Float f4 = 127f;
     System.out.println(f1 == f2);//false
     System.out.println(f3==f4);//false

 二,原理分析

 

    首先 Integer i1 = 127;将基本数据类型赋给包装类,会调用Integer.valueOf(int i)自动装包,转换为包装类对象。同理,将包装类对象赋给基本数据类型也会自动拆包。如果该包装类对象为null,则会出现NullPointerException异常。

    之所以会出现上述结果。因为Byte,Integer,Long对在-128~127之间的数据进行了缓存,如果待转换的数值 i 在该范围了则直接从缓存取,而不是new Integer(i)。

    Float和Double则是每次都new一个新的,没有缓存机制,所以都为false。

 

JDK源码:

  

/**Integer的实现**/
 public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];//IntegerCache.high为127,取缓存
        else
            return new Integer(i);
    }
/**Long的实现**/
  public static Long valueOf(long l) {
	final int offset = 128;
	if (l >= -128 && l <= 127) { // will cache
	    return LongCache.cache[(int)l + offset];
	}
        return new Long(l);
    }
/**Float的实现(无缓存)**/
  public static Float valueOf(float f) {
        return new Float(f);
    }

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值