在Java的Integer類中,有Integer.valueOf(String s)和Integer.parseInt(String s)兩個靜態方法,他們都能夠將字符串轉換為整型,他們到底有什么區別呢?今天就來分析下。
本文目錄
一、源碼分析
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)這個方法,這個方法將字符串作為有符號的十進制整數進行解析,並返回一個int類型的值。
而Integer.valueOf(String s)中又調用了public static Integer valueOf(int i) ,通過下面源碼可以看到當int數值在-128和127之間的時候,會直接從cache中獲取一個已存在Integer對象,但是不在這個范圍內的數字,則會調用new Integer(i) 創建一個新對象。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
二、結論
如果需要原始的int數據類型,則使用Integer.parseInt()方法。
如果需要包裝類對象,則使用valueOf()方法。
同樣Integer、Long、Double和Float都是一樣的道理。
三、擴展
關於IntegerCache,在-127~128之間的值都會被cache,所以當我們需要的值位於這個區間時返回的都是同一個實例,具體可以參考下面代碼:
//true,會用到緩存
System.out.println(Integer.valueOf(3) == Integer.valueOf(3));
//false,不會用到緩存
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
//true,equals比較的值,返回true
System.out.println(Integer.valueOf(3).equals(Integer.valueOf(3)));
//true,equals比較的值,返回true
System.out.println(Integer.valueOf(500).equals(Integer.valueOf(500)));
在《阿里巴巴Java開發手冊》中,也有對包裝類對象比較的說明,內容如下:
- 【強制】所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。 說明:對於Integer var = ? 在-128至127范圍內的賦值,Integer對象是在IntegerCache.cache產生,會復用已有對象,這個區間內的Integer值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會復用已有對象,這是一個大坑,推薦使用equals方法進行判斷。
推薦閱讀
1.SpringCloud系列-整合Hystrix的兩種方式)
2.SpringCloud系列-利用Feign實現聲明式服務調用)
3.手把手帶你利用Ribbon實現客戶端的負載均》
4.SpringCloud搭建注冊中心與服務注冊
5.Spring Boot配置過濾器的兩種方式!
限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高並發分布式、大數據、機器學習等技術。
關注下方公眾號即可免費領取:
