Java新特性之Java5的那些事儿-装箱与拆箱

特性列表

  • 自动化拆箱与装箱

  • 枚举

  • 泛型

  • 增强for循环

  • 可变参数

  • 注解

  • 静态导入

  • 线程池

  • Generics 类

  • 元数据

  • 协变返回类型

拆箱与装箱

​ java语言从设计之初就标识其为面向对象的一门语言,并提供了4类八种基本数据类型,在设计时每种基本类型均对应了相应的包装类型:

int Integer
byte Byte
short Short
long Long
float Float
double Double
char Character
boolean Boolean

什么是拆箱,什么又是装箱?

装箱与拆箱.jpg

​ 拆箱与装箱,这两个名称很容易让人联想到工厂车间中流水线上包装产品和打开产品时的两个常见操作,举个栗子:我们每个开发人员用到的笔记本电脑,背后需要有对应的生产厂家来负责生产组装,当电脑生产组装完毕不是直接拿到了市场上就行销售,此时会给该电脑打上标签,型号并进行打包便于后续运输和销售,而对于购买用户来说,我们在网上下过单后拿到的也不是一个裸机,我们拿到的是被厂商包装过得一台电脑产品,此时,激动的你会小手颤抖的小心打开电脑包装盒,里面有厂商给你打包好的电脑,电源,说明书等,说到这里,相信大家对于装箱与拆箱过程有整体了解。

​ 为什么需要自动装箱与拆箱?
Java早年设计的一个缺陷,基本数据类型不是对象,自然不是Object的子类,
需要装箱才能把数据类型变成一个类,那就可以把装箱过后的基本数据类型当做一个对象,就可以调用object子类的接口。而且基本数据类型是不可以作为形参使用的,装箱后就可以满足使用了。

​ Jdk1.5 引入了基本类型自动化的装箱与拆箱新特性,这两个操作不需要开发人员在负责代码的处理,而是交给编译器来自动化实现,想想是不是很美?

​ Jdk 对于装箱与拆箱的定义描述:

​ 装箱:程序在运行时自动将基本数据类型转换为包装类型;

​ 拆箱:程序在运行时自动将包装类型转换为基本数据类型。

代码演示

Java5之前拆箱与装箱示例代码((这里以Integer类型为例,其他类型同样适用,读者自行验证)):

 /**
     * Java5之前拆箱与装箱代码示例
     */
    public static void test_boxing_unboxing_4(){
        /**
         * Java5 之前得到一个2048的包装对象
         *   需要通过手动方式借助带参构造器 构造2048 Integer 对象
         */
        Integer i=new Integer(2048);
        System.out.println(i);

        /**
         * Java5 之前由包装类型得到一个2048的基本类型
         *   通过调用Integer包装对象intValue方法获取整数2048
         */
        int h=i.intValue();
        System.out.println(h);
    }

Java5之后拆箱与装箱示例代码:

public static void main(String[] args) {
    /**
     * 自动化装箱:程序在运行时自动将基本数据类型转换为包装类型;
     * Java5开始提供了自动装箱功能
     *  比如我要定义一个2048的整型对象 从Java5 开始就可以这样来编写你的代码
     *  这个过程程序在运行中会自动根据我们提供的2048数字创建一个Integer对象
     */
    Integer i=2048;// 装箱
    System.out.println(i);

    /**
     *自动化拆箱:程序在运行时自动将包装类型转换为基本数据类型。
     * Java5开始提供了自动装箱功能
     * 比如我要定义一个1024的整型对象l 此时程序在运行时就会产生装箱操作
     * 后续定义变量x 值为l 此时Integer 类型的l变量会将自已引用的1024数值赋给x 这个过程就是拆箱
     */
    Integer l=1024;// 装箱
    int x=l;// 拆箱
    System.out.println(x);
}

​ 从以上代码可以看出 Java5 之后对于基本数据类型的装箱与拆箱的代码变得相当简洁,大大简化了我们平时开发代码量。

装箱与拆箱实现

在项目编译目录下执行 通过反编译命令 javap -c,编译对应class 文件 如下图:

反编译分析.png

可以看得到:Java5 之后实现自动化装箱 内部实际上执行的是valueof 方法 ,而自动化拆箱内部执行的为intValue方法。

自动装箱与拆箱面试常见“坑”

  • Integer 比较问题
    public  static void test_autoboxing_unboxing(){
        Integer b1 = 66;
        Integer b2 = 66;
        Integer b3 = 201;
        Integer b4 = 201;
        System.out.println(b1 == b2);// true or false?
        System.out.println(b3 == b4);// true or false?
    }

这里第一个输出为true,而第二个输出为false。

1553155645479.png

答案可以从源码分析得到:当数字在-127 ~128 之间时返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

  • Double 比较问题
public  static  void test_autoboxing_unboxing02(){
        Double b1 = 66.0;
        Double b2 = 66.0;
        Double b3 = 201.0;
        Double b4 = 201.0;
        System.out.println(b1==b2);
        System.out.println(b3==b4);
    }

这里两次输出均为false。

1553156176210.png

答案可以从源码分析得到每次得到的double 对象均是一个新创建后的对象,变量的地址是不一样的,那为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现?很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是
注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。Double、Float的valueOf方法的实现是类似的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343