把一個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()