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

會點代碼的大叔 | 文【原創】數組


會點代碼的大叔
會點代碼的大叔
相關文章
相關標籤/搜索