自动装箱/自动拆箱
自动装箱相关概念:
- 自动装箱/拆箱是程序编译阶段的一个概念,与程序的运行无关,
也就是说即使你编写的是Integer i3 = 200;在程序运行时还是Integer i3 = new Integer(200);两者创建手法相等。 - 自动拆箱与装箱主要目的是为了程序猿的方便编写程序。
- 在使用自动装箱时如果是Integer类型且在:-128~127范围内创建的对象,在程序运行创建时直接调用方法区中的”整形常量池”中数字,而不会在创建对象,也就是说:Integer i1 = 10; 与 Integer i2 = 10; 最后对比(i1==i2)出来的是true,但是不使用自动装箱。直接手动装箱不管在不在范围内都是(Integer i2 = new (Integer (10); Integer i3 = new (Integer (10); i2==i3)会直接返回false
public static void m1(Object o) { System.out.println(o); } public static void main(String[] args) { // 包装类型的自动装箱(auto_boxing)、自动拆箱(auto_unboxing) // JDK5.0以后的版本可以直接使用自动装箱/拆箱,可以不用new一个对象出来调用了 // JDK5.0之前的: // int ---> Integer 装箱 Integer i1 = new Integer(11); System.out.println("JDK5.0之前的装箱:" + i1); // integer ---> Int 拆箱 int i2 = i1.intValue(); System.out.println("JDK5.0之前的拆箱:" + i2); // JDK5.0之后的 // int ---> Integer 自动装箱 Integer i3 = 200; System.out.println("JDK5.0的自动装箱:" + i3); m1(i3); // integer ---> Int 自动拆箱 int i4 = i3; System.out.println("JDK5.0的自动拆箱:" + i4); // 深入了解自动装箱拆箱 // 手动装箱 Integer i7 = new Integer(12); Integer i8 = new Integer(12); System.out.println(i7==i8);// --> false // Integer重写了equals方法,使得在Integer中比较的是两者的数值并非内存地址 System.out.println(i7.equals(i8));// --> true // 自动装箱 // 如果不超出范围值的话是搜索整型常量池中数值,然后对比i5与i6的相应数值,因为两者都是从整形常量池中创建出来的,自然是true Integer i5 = 12; Integer i6 = 12; System.out.println(i5==i6);// --> true // 自动装箱超出范围 // 如果超出范围值的话是程序在堆内存创建对象,然后直接对比i9与i10的内存地址,结果内存地址不一样返回false Integer i9 = 129; Integer i10 = 129; System.out.println(i9==i10);// --> false
- 自动装箱/拆箱是程序编译阶段的一个概念,与程序的运行无关,