在Java的Integer類中,有Integer.valueOf(String s)和Integer.parseInt(String s)兩個靜態(tài)方法,他們都能夠?qū)⒆址D(zhuǎn)換為整型救欧,他們到底有什么區(qū)別呢确沸?今天就來分析下偶惠。
分析
Integer.parseInt(String s)的源碼:
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
Integer.valueOf(String s)的源碼:
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
從源碼可以看到:
Integer.parseInt(String s)將會返回int常量。
Integer.valueOf(String s)將會返回Integer類型的對象笔喉。
Integer.valueof() 和 Integer.parseInt() 的底層都用到了Integer.parseInt(String s ,int radix)這個方法,這個方法將字符串作為有符號的十進(jìn)制整數(shù)進(jìn)行解析硝皂,并返回一個int類型的值常挚。
而Integer.valueOf(String s)中又調(diào)用了public static Integer valueOf(int i) ,通過下面源碼可以看到當(dāng)int數(shù)值在-128和127之間的時候稽物,會直接從cache中獲取一個已存在Integer對象奄毡,但是不在這個范圍內(nèi)的數(shù)字,則會調(diào)用new Integer(i) 創(chuàng)建一個新對象贝或。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
結(jié)論
如果需要原始的int數(shù)據(jù)類型吼过,則使用Integer.parseInt()方法。
如果需要包裝類對象咪奖,則使用valueOf()方法盗忱。
同樣Integer、Long羊赵、Double和Float都是一樣的道理趟佃。