new Integer(1) 与 Integer.valueOf(1) 的区别

关于 Java 字符串 String 有一道很基础的面试题,相信不少人都遇到过,就是 String s = "a" 和 String s = new String("a") 的区别是什么?相信你们都能回答上来。
那么你知道这三者有什么区别么?java

Integer i = new Integer(1) ;
Integer i = Integer.valueOf(1) ;
Integer i = 1 ; 
复制代码

new Integer(1) 与 Integer.valueOf(1)

  • new Integer(1) :会新建一个对象;
  • Integer.valueOf(1) :使用对象池中的对象,若是屡次调用,会取得同一个对象的引用。

对象池机制

为了提升性能,Java 在 1.5 之后针对八种基本类型的包装类,提供了和 String 类同样的对象池机制;
让咱们看一下 Integer.valueOf(int i) 的源码,就很容易理解了:nginx

public final class Integer extends Number implements Comparable<Integer{
  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
}
复制代码

  • Integer.valueOf() 中有个内部类 IntegerCache,相似于一个常量数组,也叫对象池,它维护了一个 Integer 数组 cache,长度为(128+127+1)=256,意味着 Integer 缓存池的大小默认为 -128 ~ 127 ;
  • Integer类中还有一个静态代码块,默认建立了数值【-128-127】的 Integer 缓存数据;因此当 Integer.valueOf(1) 的时候,会直接在该在对象池找到该值的引用;
  • 在 jdk 1.8 中,在启动 JVM 的时候,能够经过配置来指定这个缓冲池的大小。

Integer i = 1 与 Integer.valueOf(1)

Integer i = 1 ; 
复制代码

等号左边是 Integer 类型,等号右边是 int 类型 ,这种写法叫作装箱(基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成),而装箱操做是经过 Integer.valueOf(1) 完成的,因此:web

Integer i = 1 等同于 Integer.valueOf(1) 面试

其余基本类型对应的缓冲池

  • Boolean:true , false
  • Short, Int, Long:-128 ~ 127
  • Byte, Character : \u0000 到 \u007F,也就是 0 ~ 127

会点代码的大叔 | 文【原创】数组


会点代码的大叔
会点代码的大叔
相关文章
相关标签/搜索