Java 自动装箱拆箱

来源:互联网 发布:php多线程和多进程 编辑:程序博客网 时间:2024/05/22 07:54

本文讨论内容基于Jdk1.7
这个主题是半年前想写的,当时没有完成就扔到草稿箱了,最近工作比较闲,决定重新整理一下。

作者按照层次递进列举相关知识如下,如有遗漏请留言:

  1. Java共有8个基本类型【char、byte、short、int、long、float、double、boolean】,与其相对的有8个包装类【Charactor、Byte、Short、Integer、Long、Float、Double、Boolean】。
  2. Java从1.5版本开始引入自动装箱和自动拆箱功能
  3. 自动装箱拆箱是针对基本类型说的
  4. 将基本类型赋值给包装类(包括将基本类型当做参数传入参数为包装类的方法)叫自动装箱,形如Integer a = int b;
  5. 将包装类赋值给基本类型(包括将包装类对象当做参数传入参数为基本类型的方法)叫自动拆箱,形如int c = Integer d;
  6. 所有装箱操作都是包装类的valueOf()方法实现的,虚拟机会在编译的时候将需要自动装箱的代码编译成valueOf()格式
  7. 所有拆箱操作都是包装类的xxxValue()方法实现的,同样是在编译阶段进行转化;
  8. 在不修改虚拟机参数的前提下,char类型的值在0~127之间,byte、short、int、long类型的值在-128~127时,被自动装箱或者显示调用valueOf()创建的包装类对象,会在内存中被缓存,虽然十分不推荐这么做,但是确实可以使用==判断处于这个区间值相等。
  9. 只有int类型的缓存上限(127)可以被指定一个大于等于127的数(小于127会被忽略),指定Jvm参数(-XX:AutoBoxCacheMax=150),那么在-128~150之间的整数都将被缓存,虚拟机在启动的时候会在sun.misc.VM类中
private static final Properties savedProps;

        字段设置私有属性java.lang.Integer.IntegerCache.high,Integer的缓存放在静态类IntegerCache

        中,初始化由IntegerCache静态块完成,在程序第一次调用Integer.valueOf()时完成初始化。

10. 在自动拆箱的时候有可能发生NullPointerException,这是由于拆箱调用方法intObject.intValue();如果intObject == null,就会抛出空指针异常,这样的错误很多时候被开发者忽略,多见于写的工具类方法参数为基本类型,在调用的时候使用的对象里的包装类直接传参。应该做好对象为空判断。