博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我所理解的JDK自动装箱和拆箱
阅读量:5903 次
发布时间:2019-06-19

本文共 2707 字,大约阅读时间需要 9 分钟。

hot3.png

1,什么是自动装箱和拆箱?

Java中有8种基本数据类型:1字节=8bit(位)

  • 整形:byte(1字节) short(2字节) int(4字节) long(8字节)
  • 浮点型:float(4字节) double(8字节)
  • 字符型:char(2字节)
  • 布尔型boolean(JVM未规定,Hospot采用4字节)

对应的包装类型为:Byte、Short、Integer、Long、Float、Double、Character、Boolean

包装类型的对象存在与堆空间中。基本数据类型的存在是为了更有效率地方便计算。

  JDK1.5之前,这两种类型不能直接转换。从JDK1.5开始,为了方便开发,开始支持这两种类型直接转换。从基本数据类型到包装类型称为装箱,从包装类型到基本数据类型称为拆箱

Integer i = 3; // 自动装箱int a = i; // 自动拆箱

2,自动装箱和拆箱的源码实现

先看int和Integer的转换:

Integer类有个属性: private final int value;

自动拆箱会调用Integer.intValue(),源码:

public int intValue() {        return value;    }

自动装箱会调用Integer.valueOf(),源码:

public static Integer valueOf(int i) {        if (i >= IntegerCache.low && i <= IntegerCache.high) // 如果i在IntegerCache.low和IntegerCache.high的范围内            return IntegerCache.cache[i + (-IntegerCache.low)]; //返回IntegerCache.cache[]中的Integer数据        return new Integer(i); // 如果不在缓存范围内,新建一个Integer对象    }

IntegerCache是Integer的一个内部私有类,源码:

private static class IntegerCache {        static final int low = -128;        static final int high;        static final Integer cache[];        static { // 内部类的静态代码块,首次使用该类的时候执行初始化            // high value may be configured by property            int h = 127;            String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); // 可以通过启动参数-Djava.lang.Integer.IntegerCache.high=127来指定            if (integerCacheHighPropValue != null) {                try {                    int i = parseInt(integerCacheHighPropValue);                    // 最大值不能小于127                    i = Math.max(i, 127);                    // 最大值不能超过Integer.MAX_VALUE=2147483647                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);                } catch( NumberFormatException nfe) {                    // 如果指定的参数不能转换为int类型数据,直接跳过。                }            }            high = h;            cache = new Integer[(high - low) + 1];            int j = low;            for(int k = 0; k < cache.length; k++) // 为缓存数组赋值                cache[k] = new Integer(j++);            assert IntegerCache.high >= 127;        }        private IntegerCache() {}    }

  其他的整形类型和字符型与此类似,均有缓存。Byte,Short,Long 有固定范围: -128 到 127。对于 字符型Character, 范围是 0 到 127。

  除了 Integer 可以通过参数改变范围外,其它的都不行。
  自动装箱时如果是缓存边界之外的数据,则新创建对象,否则返回缓存中的对象
  浮点型数据没有缓存。(可能因为浮点型数据没有范围。。。)

布尔型Boolean的装箱和拆箱源码: Boolean类有3个属性:

public static final Boolean TRUE = new Boolean(true);public static final Boolean FALSE = new Boolean(false);private final boolean value;

自动装箱的源码:

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

自动拆箱的源码:

public boolean booleanValue() {        return value;    }

参考资料:

  1. 以上内容为笔者日常琐屑积累,已无从考究引用。如果有,请站内信提示。

转载于:https://my.oschina.net/u/3466682/blog/1581964

你可能感兴趣的文章
知识的无力感
查看>>
c++打印蛇形矩阵
查看>>
由People Hub 引发的那些事儿
查看>>
电力系统【第四章:复杂电力系统潮流分布的计算机算法】
查看>>
LCT 模板及套路总结
查看>>
40种网站设计常用技巧
查看>>
caffe画loss和accurary的曲线
查看>>
bootstrap Table 中给某一特定值设置table选中
查看>>
模式识别与智能计算学习笔记1
查看>>
使用Mysql实现QQ数据库管理
查看>>
获取对象的key值,并保存在数组中
查看>>
工作散记 二
查看>>
this指针/常函数、常对象
查看>>
<bean> 中配置详解 </bean>
查看>>
求质数
查看>>
numpy函数白板
查看>>
、web前端的这么知识应该是怎样的一个知识体系架构?
查看>>
ttf文件属性详细信息
查看>>
WinForm 实现按 Enter键 动态将光标定位到下一个TextBox
查看>>
DataSet导出到Excel
查看>>