Java中String轉(zhuǎn)Integer的九種方法及避坑指南
引言:這個轉(zhuǎn)換不簡單!
各位老鐵們(敲黑板),別以為String轉(zhuǎn)Integer就是調(diào)個方法的事!咱們團隊上周剛踩了個大坑:用戶輸入的"00123"轉(zhuǎn)成Integer居然報錯了??。@不驚喜?意不意外?)今天就帶大家深挖JDK源碼,看看這個看似簡單的操作背后有多少"騷操作"!
一、九種轉(zhuǎn)換大法(總有一款適合你)
1. 經(jīng)典姿勢:Integer.parseInt()
String numStr = "42"; int num = Integer.parseInt(numStr); // 最常用姿勢
劃重點:返回基本類型int,效率高!但有個坑(后面說)
2. 對象派:Integer.valueOf()
Integer numObj = Integer.valueOf("42"); // 返回Integer對象
這里有個冷知識:-128到127之間的數(shù)字會被緩存(不信?后面源碼驗證?。?/p>
3. 構(gòu)造器大法(已過時!)
@Deprecated
Integer deprecated = new Integer("42"); // Java9+已廢棄
重要提醒:這個方法會產(chǎn)生新對象,性能差,千萬別用?。ㄖ匾氖虑檎f三遍)
4. 進制自由切換
int binary = Integer.parseInt("1010", 2); // 二進制轉(zhuǎn)十進制 → 10
支持2-36進制,比如:
Integer.parseInt("FF", 16); // → 255
Integer.parseInt("Z", 36); // → 35
5. 自動裝箱(語法糖陷阱)
Integer magic = Integer.parseInt("42"); // 自動裝箱
相當(dāng)于:
Integer magic = Integer.valueOf(Integer.parseInt("42"));
6. 異常處理最佳實踐
try {
Integer.parseInt("123a"); // 這里會爆炸!
} catch (NumberFormatException e) {
System.out.println("抓住一只野生異常!");
}
血淚教訓(xùn):不做異常捕獲的系統(tǒng),上線必掛!(別問我怎么知道的)
7. 第三方庫大法
比如Apache Commons Lang:
NumberUtils.toInt("123", 0); // 轉(zhuǎn)換失敗返回默認(rèn)值0
適合對異常處理有潔癖的同學(xué)
8. Optional優(yōu)雅流
Optional.ofNullable(str)
.filter(s -> s.matches("-?\\d+"))
.map(Integer::parseInt);
函數(shù)式編程愛好者的裝X神器
9. 正則表達式驗證
if (str.matches("-?\\d+")) {
Integer.parseInt(str);
}
提前過濾非法字符,把異常扼殺在搖籃里
二、源碼深度游(JDK17版)
parseInt()核心邏輯解析
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s, 10);
}
// 真正的硬核方法(建議搭配咖啡食用)
public static int parseInt(String s, int radix) {
// 1. 空值檢測
if (s == null) {
throw new NumberFormatException("null");
}
// 2. 進制范圍檢查(2-36)
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
}
// 3. 遍歷字符計算值
int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
// 處理符號位
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') {
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+') {
throw NumberFormatException.forInputString(s);
}
i++;
}
// 核心計算邏輯(此處省略20行)
// ...
}
throw NumberFormatException.forInputString(s);
}
靈魂拷問:為什么用負(fù)數(shù)進行計算?這是為了統(tǒng)一處理Integer.MIN_VALUE的情況!
valueOf()的緩存玄機
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
// 緩存類的秘密
private static class IntegerCache {
static final int low = -128;
static final int high;
static {
// 可以通過JVM參數(shù)調(diào)整上限!
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
h = Math.max(parseInt(integerCacheHighPropValue), 127);
} catch(NumberFormatException nfe) {
}
}
high = h;
// 初始化緩存數(shù)組...
}
}
驚天大發(fā)現(xiàn):可以通過-XX:AutoBoxCacheMax=250來擴大緩存范圍!
三、性能對決(實測數(shù)據(jù)說話)
| 方法 | 執(zhí)行100萬次耗時 | 內(nèi)存分配 |
|---|---|---|
| parseInt() | 120ms | 無 |
| valueOf() | 150ms | 2MB |
| new Integer() | 450ms | 16MB |
| 第三方庫NumberUtils | 180ms | 1MB |
結(jié)論:高頻場景優(yōu)先用parseInt,需要對象時直接用valueOf!
四、避坑指南(來自血淚史)
- 前導(dǎo)零問題:parseInt(“0123”) → 123(但如果是電話號碼要保留零?)
- 空字符串:parseInt(“”) → 直接爆炸!
- 溢出問題:parseInt(“2147483648”) → 拋出異常(Integer.MAX_VALUE是2147483647)
自動拆箱NPE:
Integer num = null; int i = num; // 運行時NullPointerException!
緩存陷阱:
Integer a = 127; Integer b = 127; System.out.println(a == b); // true Integer c = 128; Integer d = 128; System.out.println(c == d); // false
五、終極選擇指南
場景建議:
- 表單驗證:正則預(yù)處理 + try-catch
- 高頻數(shù)值處理:parseInt + 基本類型
- 集合存儲:直接使用valueOf
- 不確定輸入:Optional優(yōu)雅處理
個人私貨:除非必要,否則不要創(chuàng)建Integer對象!能用int就別用Integer(特別是Android開發(fā))
結(jié)語
到此這篇關(guān)于Java中String轉(zhuǎn)Integer的九種方法及避坑指南的文章就介紹到這了,更多相關(guān)Java String轉(zhuǎn)Integer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實現(xiàn)簡單學(xué)生管理系統(tǒng)項目
這篇文章主要介紹了java實現(xiàn)簡單學(xué)生管理系統(tǒng)項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07
Spring Boot 配置MySQL數(shù)據(jù)庫重連的操作方法
這篇文章主要介紹了Spring Boot 配置MySQL數(shù)據(jù)庫重連的操作方法,需要的朋友可以參考下2018-04-04
spring boot優(yōu)雅集成redisson詳解
這篇文章主要為大家介紹了spring boot優(yōu)雅集成redisson詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

