Java中Integer.parseInt和Integer.valueOf,你還傻傻分不清嗎?


在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開發手冊》中,也有對包裝類對象比較的說明,內容如下:

  1. 【強制】所有的相同類型的包裝類對象之間值的比較,全部使用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等高並發分布式、大數據、機器學習等技術。
關注下方公眾號即可免費領取:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM