最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中String轉(zhuǎn)Integer的九種方法及避坑指南

 更新時間:2025年07月02日 09:56:03   作者:fluxcode  
本文詳細(xì)介紹了在Java編程語言中,如何將String類型的數(shù)據(jù)轉(zhuǎn)換為Integer類型,主要探討了九種轉(zhuǎn)換方法及避坑指南,并提供了具體的代碼示例進行說明,需要的朋友可以參考下

引言:這個轉(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ù)字會被緩存(不信?后面源碼驗證!)

3. 構(gòu)造器大法(已過時?。?/h3>
@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),上線必掛?。▌e問我怎么知道的)

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()150ms2MB
new Integer()450ms16MB
第三方庫NumberUtils180ms1MB

結(jié)論:高頻場景優(yōu)先用parseInt,需要對象時直接用valueOf!

四、避坑指南(來自血淚史)

  1. 前導(dǎo)零問題:parseInt(“0123”) → 123(但如果是電話號碼要保留零?)
  2. 空字符串:parseInt(“”) → 直接爆炸!
  3. 溢出問題: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)文章

  • JDK文件目錄結(jié)構(gòu)及配置環(huán)境變量全過程

    JDK文件目錄結(jié)構(gòu)及配置環(huán)境變量全過程

    這篇文章主要介紹了JDK文件目錄結(jié)構(gòu)及配置環(huán)境變量全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • springboot jasypt2.x與jasypt3.x的使用方式

    springboot jasypt2.x與jasypt3.x的使用方式

    在軟件開發(fā)中,將配置文件中的敏感信息(如數(shù)據(jù)庫密碼)進行加密是保障安全的有效手段,jasypt框架提供了這一功能,支持通過加密工具類或命令行工具生成密文,并通過修改配置文件和啟動參數(shù)的方式使用密文和密鑰,這樣即便配置文件被泄露
    2024-09-09
  • Java使用反射和動態(tài)代理實現(xiàn)一個View注解綁定庫

    Java使用反射和動態(tài)代理實現(xiàn)一個View注解綁定庫

    這篇文章主要介紹了Java使用反射和動態(tài)代理實現(xiàn)一個View注解綁定庫,代碼簡潔,使用簡單,擴展性強,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Java Calendar類的詳解及使用實例

    Java Calendar類的詳解及使用實例

    這篇文章主要介紹了Java Calendar類的詳解及使用實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java實現(xiàn)圖片驗證碼具體代碼

    Java實現(xiàn)圖片驗證碼具體代碼

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)圖片驗證碼具體代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Springboot整合Rabbitmq之Confirm和Return機制

    Springboot整合Rabbitmq之Confirm和Return機制

    這篇文章主要介紹了Springboot整合Rabbitmq之Confirm和Return詳解,本篇重點進行Confirm?機制和Return?機制的實現(xiàn)和說明,通過實例代碼相結(jié)合給大家詳細(xì)介紹,對Springboot整合Rabbitmq相關(guān)知識感興趣的朋友一起看看吧
    2022-02-02
  • Spring Boot使用過濾器Filter過程解析

    Spring Boot使用過濾器Filter過程解析

    這篇文章主要介紹了Spring Boot使用過濾器Filter過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Springcloud ribbon負(fù)載均衡算法實現(xiàn)

    Springcloud ribbon負(fù)載均衡算法實現(xiàn)

    這篇文章主要介紹了Springcloud ribbon負(fù)載均衡算法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java編程使用卡片布局管理器示例【基于swing組件】

    Java編程使用卡片布局管理器示例【基于swing組件】

    這篇文章主要介紹了Java編程使用卡片布局管理器,結(jié)合實例形式分析了java基于swing組件的卡片布局管理器具體實現(xiàn)與使用技巧,需要的朋友可以參考下
    2018-01-01
  • Java中的字符串用法小結(jié)

    Java中的字符串用法小結(jié)

    這篇文章主要介紹了Java中的字符串用法,實例總結(jié)了java中關(guān)于字符串操作的各種常用的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04

最新評論

兴隆县| 晋中市| 伊金霍洛旗| 和顺县| 修武县| 旅游| 荣昌县| 敦化市| 澳门| 临澧县| 阳城县| 蛟河市| 永平县| 大石桥市| 黄陵县| 绥滨县| 琼结县| 新绛县| 双牌县| 榕江县| 南开区| 乌恰县| 航空| 禄丰县| 大邑县| 贵阳市| 莱西市| 万年县| 承德市| 德保县| 咸宁市| 寻乌县| 柯坪县| 思茅市| 平江县| 手游| 舟曲县| 邵武市| 镇赉县| 蓬溪县| 天津市|