全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java拆装箱深度剖析

先来看一段代码:

public class Main{
  public static void main(String[] args){

    Integer num1 = 100;
    Integer num2 = 100;
    Integer num3 = 200;
    Integer num4 = 200;

    '''//输出结果'''
    System.out.println(num1==num2);
    System.out.println(num3==num4);
  }
}

猜猜结果是什么?

很多人都会认为结果全为true,但结果去不是这样的

true
false

为什么是这样的结果?如果用内存来解释结果的话,num1和num2指向的是同一个对象,而num3和num4则指向的确是不同的对象。接下来就告诉你为什么,看一看Integer类型的valueof方法的源码:

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

其中IntegerCache的实现:

'''// IntegerCache,一个内部类,注意它的属性都是定义为static final'''
  private static class IntegerCache {
    static final int high; '''//缓存上界,暂为null'''
    static final Integer cache[]; '''//缓存的整型数组'''

    '''// 块,为什么定义为块'''
    static {
      final int low = -128; '''// 缓存下界,不可变了。只有上界可以改变'''

      '''// high value may be configured by property'''
      '''// h值,可以通过设置jdk的AutoBoxCacheMax参数调整(以下有解释),自动缓存区间设置为[-128,N]。注意区间的下界是固定'''
      int h = 127;

      if (integerCacheHighPropValue != null) {
        '''// Use Long.decode here to avoid invoking methods that'''
        '''// require Integer's autoboxing cache to be initialized'''
        // 通过解码integerCacheHighPropValue,而得到一个候选的上界值'''
        int i = Long.decode(integerCacheHighPropValue).intValue();
        '''// 取较大的作为上界,但又不能大于Integer的边界MAX_VALUE'''
        i = Math.max(i, 127);   
        '''// Maximum array size is Integer.MAX_VALUE'''
        h = Math.min(i, Integer.MAX_VALUE - -low);
      }
      high = h; '''//上界确定'''
      '''// 就可以创建缓存块,注意缓存数组大小'''
      cache = new Integer[(high - low) + 1]; //
      int j = low;
      for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++); '''// -128到high值逐一分配到缓存数组'''
    }

    private IntegerCache() {}
  }

通过这两段代码可以看出,在通过valueof方法创建Integer类型对象时,取值范围为[-128,127],数值在这个区间里,指针指向IntegerCache.cache中已经存在的对象引用,当数值超出这个范围,就会创建一个新的对象。

有一点需要注意的是,并不是所有的类型都是这个范围,看Double类型:

public class Main{
  public static void main(String[] args){

    Double i1 = 100.0;
    Double i2 = 100.0;
    Double i3 = 200.0;
    Double i4 = 200.0;

    System.out.println(i1==i2);
    System.out.println(i3==i4);
  }
}

最终的输出结果:

false
false

具体为什么回事这样的结果,大伙可以去看看源代码中Double valueof方法的实现,其和Integer valueof方法不同,是因为在某个范围内的整型数值的个数是有限的,而浮点数却不是。

注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
Double、Float的valueOf方法的实现是类似的。

拉下了一个,Boolean类型的结果有两个True or False。直接看源代码:

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
  }

而其中的TRUE和FALSE是这样定义的:

public static final Boolean TRUE = new Boolean(true);

'''/** '''
'''* The <code>Boolean</code> object corresponding to the primitive '''
'''* value <code>false</code>. '''
'''*/'''
public static final Boolean FALSE = new Boolean(false);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Java拆箱  # Java装箱  # Java拆装箱  # Java中的装箱和拆箱深入理解  # 浅谈Java自动装箱与拆箱及其陷阱  # java自动装箱拆箱深入剖析  # .NET 中的装箱与拆箱实现过程  # 再议C#中的装箱与拆箱的问题详解  # 解析C#中的装箱与拆箱的详解  # C#实现装箱与拆箱操作简单实例  # c#装箱和拆箱知识整理  # C#装箱和拆箱原理详解  # 轻松学习C#的装箱与拆箱  # 的是  # 都是  # 是这样  # 源代码  # 整型  # 就会  # 是因为  # 在这个  # 很多人  # 告诉你  # 下了  # 回事  # 可以通过  # 可以看出  # 但又  # 这几个  # 设置为  # 创建一个  # 需要注意  # 大家多多 


相关文章: 如何在阿里云完成域名注册与建站?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何高效搭建专业期货交易平台网站?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  如何通过IIS搭建网站并配置访问权限?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何在建站之星绑定自定义域名?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  制作公司内部网站有哪些,内网如何建网站?  如何做静态网页,sublimetext3.0制作静态网页?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何在阿里云服务器自主搭建网站?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  javascript中的try catch异常捕获机制用法分析  活动邀请函制作网站有哪些,活动邀请函文案?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  Python如何创建带属性的XML节点  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何在云服务器上快速搭建个人网站?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  公司网站的制作公司,企业网站制作基本流程有哪些?  建站主机选购指南与交易推荐:核心配置解析  建站之星安装步骤有哪些常见问题?  如何选择建站程序?包含哪些必备功能与类型?  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何选择域名并搭建高效网站?  购物网站制作公司有哪些,哪个购物网站比较好?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  建站之星伪静态规则如何正确配置?  Python多线程使用规范_线程安全解析【教程】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站主机类型有哪些?如何正确选型  智能起名网站制作软件有哪些,制作logo的软件?  如何快速搭建二级域名独立网站?  如何在香港服务器上快速搭建免备案网站?  如何选择高效便捷的WAP商城建站系统?  网页设计网站制作软件,microsoft office哪个可以创建网页?  建站之星安装模板失败:服务器环境不兼容?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何在服务器上三步完成建站并提升流量?  贸易公司网站制作流程,出口贸易网站设计怎么做?  如何高效完成独享虚拟主机建站?  建站上传速度慢?如何优化加速网站加载效率?  如何通过服务器快速搭建网站?完整步骤解析  Python lxml的etree和ElementTree有什么区别  学校建站服务器如何选型才能满足性能需求? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。