整数包装类的装箱问题

整数包装类

对于Long Integer Byte Short等整数包装类而言,Java会缓存 [-128,127] 的整数。也就是说,对于两个同类型整数包装类对象的值,满足:

  • 在这个区间内,并且值相同

  • 间接或直接使用静态方法valueOf创建对象

    • 间接是指直接赋一个整数值

      Integer integer = 3;
      
    • 直接是直接调用valueOf方法

      Integer integer = Integer.valueOf(3);
      

就表示两个对象的地址空间相同。

解析

创建对象的三种方法

以Integer为例

  • 构造方法

        public Integer(int value) {
            this.value = value;
        }
    
  • 直接赋值 && valueOf方法

        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
    

三者的区别与联系

  • 构造方法的方式一视同仁,对于任意的装箱,都是创建新的对象,不会有地址空间重复的情况

  • 直接赋值和valueOf方法相同,前者间接调用valueOf方法完成赋值。

    • 它会首先判断是否在[-127,128]区间内,若在,则返回缓存数组cache中相对应的引用;

    ? 若不在,则调用构造方法创建对象。

    • 值得一提的是,因为byte类型数据本身的赋值范围就在此区间内,所以它的构造方法和后两种是分开的。即通过后两种方法必然会在此区间内。

整数包装类的装箱问题

上一篇:2.面向对象基础-02包


下一篇:sublime 3同步编辑线上代码