天天看點

Integer.parseInt("") Integer.valueOf("")和new Integer("")之間的差別

把一個String轉換成int有

Integer.parseInt("")

Integer.valueOf("")

new Integer("")

這麼幾種方式,它們之間有什麼差別呢?我們可以分别看一下它們的源碼

//Integer.parseInt("")
public static int parseInt(String s) throws NumberFormatException {
  return parseInt(s,10);
}
//Integer.valueOf("")
public static Integer valueOf(String s) throws NumberFormatException {
  return Integer.valueOf(parseInt(s, 10));
}
//new Integer("")
public Integer(String s) throws NumberFormatException {
  this.value = parseInt(s, 10);
}
           

從源碼中可以看出,

Integer.valueOf("")

Integer.parseInt("")

内部實作是一樣的,它們之間唯一的差別就是Integer.valueOf(“”)傳回的是一個Integer對象,而Integer.parseInt(“”)傳回的是一個基本類型的int。

我們再看

Integer.valueOf("")

new Integer("")

,它們同樣傳回的是一個Integer對象,但它們又有什麼差別呢?我們再進入

Integer.valueOf(parseInt(s, 10) )

方法内部:

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

對象,當

IntegerCache

中存在時就從cache中取,不存在時才會調用

new Integer(i)

構造函數傳回一個Integer對象。是以

Integer.valueOf("")

會用到cache,其效率可能會比用構造函數

new Integer(i)

高。

關于

IntegerCache

,在-127~128之間的值都會被cache,是以當我們要的值位于這個區間時傳回的都是同一個執行個體,例如:

System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
           

上面程式的運作結果是:

false //會用到緩存
    true  //不會用到緩存
           

綜上所述:

  • 當我們需要的是一個基本類型* int *的時候我們需要使用

    Integer.parseInt()

    函數
  • 當我們需要的是一個Integer對象類的時候我們就是用

    Integer.valueOf()

    函數

繼續閱讀