装箱

将基本数据类型用它们对应的引用类型包装起来;

拆箱

将包装类型转换为基本数据类型;

  1. public class BoxTest {
  2. /**
  3. *装箱(基本数据类型转为包装类型)
  4. */
  5. private Integer i = 1;
  6. private Integer j = 2;
  7. /**
  8. *拆箱(包装类型转为基本数据类型)
  9. */
  10. private int m = i;
  11. private int n = j;
  12. }

对于java的自动装箱和拆箱,我们看看源码编译后的class文件,其实装箱调用包装类的valueOf方法,拆箱调用的是xxxValue方法,下面就是变编译后的代码:
自动装箱与拆箱 - 图1

Java中的八种基本类型对应的包装类型的自动装箱和拆箱,每种包装类型都定义了2个方法valueOf装箱方法和xxxValue拆箱方法

  1. public class BoxTest {
  2. /**
  3. *装箱(基本数据类型转为包装类型)
  4. */
  5. private Integer integer = 1;
  6. private Boolean aBoolean = true;
  7. private Float aFloat = 1.00f;
  8. private Double aDouble = 1.00D;
  9. private Character character = 'c';
  10. private Long aLong = 1000L;
  11. private Byte aByte = 1;
  12. private Short aShort = 1;
  13. /**
  14. *拆箱(包装类型转为基本数据类型)
  15. */
  16. private int inta = integer;
  17. private boolean booleana = aBoolean;
  18. private float floata = aFloat;
  19. private double doublea = aDouble;
  20. private char chara = character;
  21. private long longa = aLong;
  22. private byte bytea = aByte;
  23. private short shorta = aShort;
  24. }

何时装箱和拆箱?

上面说过赋值时会自动装箱和拆箱,还有其他情况:

  1. 进行=赋值操作装箱和拆箱
  2. 进行+,-,*,/混合运算拆**箱**)
  3. 进行>,<,==比较运算拆箱
  4. 调用equals进行比较装箱
  5. 方法调用时装箱或者拆箱
  6. ArrayList,HashMap等集合类,添加基础类型数据时装箱