装箱拆箱系列:java中的Integer装箱实例

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装箱拆箱系列:java中的Integer装箱实例相关的知识,希望对你有一定的参考价值。

多数程序员或者在校学生,在平时开发中或者学习中,也就写个 int sum = 0;或者int i=0; i++;,没出什么bug,也不会关心这些多,这么细。讨论装箱,当然还是因为面试造火箭
所以先看看具体的面试题,运行下面的代码,看执行结果,引出疑问,最终了解Integer的装箱。

public class IntegerPackageTest {

    public static void main(String[] args) {

        Integer value1 = -128;  //自动装箱
        Integer value2 = -128;
        System.out.println(value1 == value2); //true
        System.out.println(value1.equals(value2));  //true
        System.out.println("-------------------");

        Integer value3 = -129;
        Integer value4 = -129;
        System.out.println(value3 == value4); //false
        System.out.println(value3.equals(value4)); //true
        System.out.println("-------------------");

        Integer value5 = 127;
        Integer value6 = 127;
        System.out.println(value5 == value6); //true
        System.out.println(value5.equals(value6));  //true
        System.out.println("-------------------");

        Integer value7 = 128;
        Integer value8 = 128;
        System.out.println(value7==value8);   //false
        System.out.println(value7.equals(value8));  //true
    }
}

什么是自动装箱? -128和-129输出结果为什么不一样?

JDK 1.5 (以后的版本)的新特性自动装箱和拆箱

  1. 装箱:把基本类型转换为包装类类型。例如:Integer是包装类,int是基本类型。

    int a =10;
    Integer i = new Integer(a);	
    
  2. 自动装箱是:Integer value = 10;
    这里提出疑问,为什么int就能直接转化为Integer ,Integer 类不应该是new出来一个对象吗?
    答案是这个过程会自动 new Integer(10) 对象。

  3. 自动装箱,范围在 -128 ~ 127 【256个数字 】的地址是一样的,-128 到 127 之间的有个自动装箱的缓存池。可以查看JDK源码Integer类中,有个私有static内部类如下:

      private static class IntegerCache {
       static final int low = -128;
       static final int high;
       static final Integer cache[];
    
       static {
         ...
       }
    
       private IntegerCache() {}
    }
    

    如果不在这个范围,就会使用new 新创建对象。所以用==判断,就会是false

以上是关于装箱拆箱系列:java中的Integer装箱实例的主要内容,如果未能解决你的问题,请参考以下文章

java中的装箱及拆箱

JAVA——装箱和拆箱

Java自动装箱与拆箱

Java自动装箱和拆箱

Java中的快速自动装箱/自动拆箱问题

深入剖析Java中的装箱和拆箱