前言
大家都知道Integer類中有Integer.valueOf(String s)和Integer.parseInt(String s)兩個(gè)靜態(tài)方法,他們都能夠?qū)⒆址D(zhuǎn)換為整型去扣。說到這里你肯定會(huì)想同一個(gè)功能為什么要提供兩個(gè)不同的方法爹橱,這不是浪費(fèi)嗎埂伦?
區(qū)別
Integer.parseInt(String s)將會(huì)返回int常量窄驹。
Integer.valueOf(String s)將會(huì)返回Integer類型沙热,如果存在緩存將會(huì)返回緩存中已有的對(duì)象。
使用不當(dāng)將會(huì)產(chǎn)生的問題
由于Java的自動(dòng)拆箱和裝箱機(jī)制導(dǎo)致我們?cè)谑褂脮r(shí)一般分別不出有什么區(qū)別口注。但是在某些要求只能使用Integer類型的地方,如果錯(cuò)誤的使用了Integer.parseInt(s)君珠,會(huì)造成一些不可預(yù)料的事情寝志。
大家都知道在java中比較兩個(gè)整型是否相等用的是==符號(hào),比較兩個(gè)對(duì)象用的是Objects.equles()策添。如果你在判斷一個(gè)字符串?dāng)?shù)字是否與某個(gè)整型相等時(shí)材部,這樣判斷
int n = 某個(gè)整型;
if( n == Integer.valueOf(s)){
//do something
}
就會(huì)出現(xiàn)一些不可預(yù)料的問題。
將一個(gè)整型n賦值給Integer變量唯竹,將會(huì)調(diào)用
Integer.valueOf(n);然而Integer.valueOf()是有緩存的乐导,會(huì)緩存-128 ~ 127范圍的整型數(shù)字。
Integer.valueOf的源碼
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在IntegerCache中cache數(shù)組初始化存入了-128 - 127的值浸颓。
cache = new Integer[(high - low) + 1];
int j = low;
for( int k = 0; k < cache.length ; k ++)
cache[k] = new Integer(j ++);
從上面我們可以知道給Interger 賦予的int數(shù)值在-128 - 127的時(shí)候物臂,直接從cache中獲取,這些cache引用對(duì)Integer對(duì)象地址是不變的产上,但是不在這個(gè)范圍內(nèi)的數(shù)字鹦聪,則new Integer(i) 這個(gè)地址是新的地址。
假如n和Integer.valueOf(s)的范圍在-128 ~ 127之間那么上面那串比較的代碼將會(huì)正常工作蒂秘。
假如兩個(gè)之中有一個(gè)不在-128 ~ 127之間泽本,那么就會(huì)調(diào)用new Integer()重新創(chuàng)建一個(gè)Integer對(duì)象,由于兩個(gè)對(duì)象引用的堆地址不一樣姻僧,將會(huì)返回false规丽,上面的代碼就不會(huì)根據(jù)預(yù)期進(jìn)行工作蒲牧。