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

Java中valueOf和parseInt的區(qū)別詳解

 更新時(shí)間:2024年01月03日 09:39:50   作者:搬山道猿  
這篇文章主要介紹了Java中valueOf和parseInt的區(qū)別詳解,在編程中,遇到類型轉(zhuǎn)換,好像會(huì)經(jīng)常用到 parseInt 和 valueOf,當(dāng)然這里只拿 Integer 類型進(jìn)行陳述,其他類型也是雷同的,需要的朋友可以參考下

前言

在編程中,遇到類型轉(zhuǎn)換,好像會(huì)經(jīng)常用到 parseInt 和 valueOf,當(dāng)然這里只拿 Integer 類型進(jìn)行陳述,其他類型也是雷同的;

想必有讀者也跟我一樣,經(jīng)常交叉使用這兩個(gè)方法,但卻不知道這兩者到底有什么區(qū)別,接下來(lái)就來(lái)探究一番;  

區(qū)別

  • Integer.parseInt(s) 的作用就是把字符串 s 解析成有符號(hào)基本類型的 int;
  • Integer.valueOf(s) 把字符串 s 解析成 Integer 對(duì)象類型,返回的對(duì)象可以調(diào)用 Integer 中的方法;

接下來(lái),通過(guò)源碼進(jìn)行逐一解析;  

parseInt

我們首先點(diǎn)進(jìn) parseInt() 方法中,

public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s, 10);
}

可以看到,這個(gè)被我們調(diào)用的 parseInt() 方法返回了一個(gè)重載方法:

public static int parseInt(String s, int radix) throws NumberFormatException {
    if (s == null) {
        throw new NumberFormatException("null");
    } else if (radix < 2) {
        throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX");
    } else if (radix > 36) {
        throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX");
    } else {
        boolean negative = false;
        int i = 0;
        int len = s.length();
        int limit = -2147483647;
        if (len <= 0) {
            throw NumberFormatException.forInputString(s);
        } else {
            char firstChar = s.charAt(0);
            if (firstChar < '0') {
                if (firstChar == '-') {
                    negative = true;
                    limit = -2147483648;
                } else if (firstChar != '+') {
                    throw NumberFormatException.forInputString(s);
                }
 
                if (len == 1) {
                    throw NumberFormatException.forInputString(s);
                }
 
                ++i;
            }
 
            int multmin = limit / radix;
 
            int result;
            int digit;
            for(result = 0; i < len; result -= digit) {
                digit = Character.digit(s.charAt(i++), radix);
                if (digit < 0 || result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
 
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
            }
 
            return negative ? result : -result;
        }
    }
}

1、首先看到的是,該方法傳入了兩個(gè)參數(shù),parseInt(String s, int radix),這個(gè)可以根據(jù)被調(diào)用時(shí)傳入的參數(shù),return parseInt(s, 10);,盲猜一下,s 就是表示要轉(zhuǎn)換成數(shù)字型的字符串,而 radix 英文是基數(shù)的意思,這里應(yīng)該表示進(jìn)制,即這個(gè)傳入的字符串是多少進(jìn)制的,那到底是不是呢,我們接著往下看;

2、這里先是對(duì)字符串 s 是否為空,以及 radix 的大小進(jìn)行一個(gè)判斷,不符合條件則拋出 NumberFormatException 異常,也就是數(shù)字格式化異常;

if (s == null){
    throw new NumberFormatException("null");
} else if (radix < 2) {
    throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX");
} else if (radix > 36) {
    throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX");
} else {

3、接著往下,再一次對(duì)長(zhǎng)度進(jìn)行一個(gè)校驗(yàn),

int len = s.length();
if (len <= 0) {
    throw NumberFormatException.forInputString(s);
} else {
	...
}

我在這里只想到了一個(gè)能讓它拋出異常的條件,

Integer.parseInt("");

運(yùn)行結(jié)果:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.base/java.lang.Integer.parseInt(Integer.java:662)
    at java.base/java.lang.Integer.parseInt(Integer.java:770)

4、接下來(lái)會(huì)檢測(cè)第一個(gè)字符是啥,如果是 -,則將 negative 設(shè)置成 true,表示這是個(gè)負(fù)數(shù),并且將邊界 limit 設(shè)置成最小邊界;

如果不是 +,則表示該字符既不是數(shù)字,不也是性質(zhì)符號(hào),因此拋出 NumberFormatException 異常;

如果字符串 s 的長(zhǎng)度只有1,則表明這是非數(shù)字,不符合要求,也拋出 NumberFormatException 異常;

++i 是因?yàn)槿绻谝晃皇欠?hào)的話,那么在后續(xù)的循環(huán)中追加數(shù)字則直接跳過(guò)首位;

 char firstChar = s.charAt(0);
 if (firstChar < '0') {
     if (firstChar == '-') {
         negative = true;
         limit = -2147483648;
     } else if (firstChar != '+') {
         throw NumberFormatException.forInputString(s);
     }
 
     if (len == 1) {
         throw NumberFormatException.forInputString(s);
     }
 
     ++i;
 }

5、根據(jù)進(jìn)制來(lái)調(diào)整邊界,以防越界;

int multmin = limit / radix;

6、Character.digit() 用于將字符轉(zhuǎn)為為對(duì)應(yīng)進(jìn)制的整數(shù),如果該字符不是進(jìn)制內(nèi)的就返回-1,例如輸入的字符是9,但是進(jìn)制是2,那么就不符合,則會(huì)返回-1;

然后就是進(jìn)行計(jì)算;

int result;
int digit;
for(result = 0; i < len; result -= digit) {
    digit = Character.digit(s.charAt(i++), radix);
    if (digit < 0 || result < multmin) {
        throw NumberFormatException.forInputString(s);
    }
 
    result *= radix;
    if (result < limit + digit) {
        throw NumberFormatException.forInputString(s);
    }
}

7、最后判斷是否為負(fù)數(shù)完成轉(zhuǎn)換;

return negative ? result : -result;

valueOf

照例查看源碼:

public static Integer valueOf(String s, int radix) throws NumberFormatException {
    return parseInt(s, radix);
}
 
public static Integer valueOf(String s) throws NumberFormatException {
    return parseInt(s, 10);
}
 
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
    return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i);
}

可以看出 valueOf(String s, int radix) 和 valueOf(String s) 都是直接調(diào)用返回了 parseInt 方法,而 valueOf(int i) 則是一個(gè) int 轉(zhuǎn)成 Integer 的自動(dòng)裝箱;

接下來(lái)探究一下 IntegerCache ,可以看出這是 Integer 的成員內(nèi)部類,來(lái)看源碼:

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer[] cache;
    static Integer[] archivedCache;
 
    private IntegerCache() {
    }
 
    static {
        int h = 127;
        String integerCacheHighPropValue = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        int size;
        if (integerCacheHighPropValue != null) {
            try {
                size = Integer.parseInt(integerCacheHighPropValue);
                size = Math.max(size, 127);
                h = Math.min(size, 2147483518);
            } catch (NumberFormatException var6) {
            }
        }
 
        high = h;
        VM.initializeFromArchive(Integer.IntegerCache.class);
        size = high - -128 + 1;
        if (archivedCache == null || size > archivedCache.length) {
            Integer[] c = new Integer[size];
            int j = -128;
 
            for(int k = 0; k < c.length; ++k) {
                c[k] = new Integer(j++);
            }
 
            archivedCache = c;
        }
 
        cache = archivedCache;
 
        assert high >= 127;
 
    }
}

整體就是初始化一個(gè) IntegerCache.cache 數(shù)組,數(shù)組里面存儲(chǔ)-128到127之間的數(shù)字當(dāng)做是緩存,源碼一開(kāi)始是分析數(shù)組長(zhǎng)度,然后給數(shù)組賦值;

總的來(lái)說(shuō),三個(gè)重構(gòu)的 valueOf() 方法還是大同小異的:

  • Integer valueOf(int i):返回一個(gè)表示指定的 int 值的 Integer 實(shí)例;
  • Integer valueOf(String s):返回保存指定的 String 的值的 Integer 對(duì)象;
  • Integer valueOf(String s, int radix):返回一個(gè) Integer 對(duì)象,該對(duì)象中保存了用第二個(gè)參數(shù)提供的基數(shù)進(jìn)行解析時(shí)從指定的 String 中提取的值;

到此這篇關(guān)于Java中valueOf和parseInt的區(qū)別詳解的文章就介紹到這了,更多相關(guān)valueOf和parseInt的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)

    java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • java 解析user-agent 信息

    java 解析user-agent 信息

    這篇文章主要介紹了java 解析http user-agent的信息的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • springboot如何獲取接口下所有實(shí)現(xiàn)類

    springboot如何獲取接口下所有實(shí)現(xiàn)類

    這篇文章主要介紹了springboot如何獲取接口下所有實(shí)現(xiàn)類問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • SpringMVC框架自定義攔截器的過(guò)程詳解

    SpringMVC框架自定義攔截器的過(guò)程詳解

    文章主要介紹了SpringMVC框架中的攔截器及其工作原理,包括攔截器的定義、執(zhí)行流程、與過(guò)濾器的區(qū)別,以及如何自定義和配置攔截器,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • SpringCloud使用CircuitBreaker實(shí)現(xiàn)熔斷器的詳細(xì)步驟

    SpringCloud使用CircuitBreaker實(shí)現(xiàn)熔斷器的詳細(xì)步驟

    在微服務(wù)架構(gòu)中,服務(wù)之間的依賴調(diào)用非常頻繁,當(dāng)一個(gè)下游服務(wù)因高負(fù)載或故障導(dǎo)致響應(yīng)變慢或不可用時(shí),可能會(huì)引發(fā)上游服務(wù)的級(jí)聯(lián)故障,最終導(dǎo)致整個(gè)系統(tǒng)崩潰,熔斷器是解決這類問(wèn)題的關(guān)鍵模式之一,Spring Cloud提供了對(duì)熔斷器的支持,本文將詳細(xì)介紹如何集成和使用它
    2025-02-02
  • Maven Scope 取值范圍小結(jié)

    Maven Scope 取值范圍小結(jié)

    在Maven項(xiàng)目的pom.xml文件中,通常會(huì)給dependency設(shè)置scope屬性,本文主要介紹了Maven Scope 取值范圍,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • SpringBoot?將配置文件掛到?jar?包外面的操作方法

    SpringBoot?將配置文件掛到?jar?包外面的操作方法

    在 SpringBoot 中,可以將配置文件放在 jar 包外面,這樣可以方便地修改配置而不需要重新打包和部署,這篇文章主要介紹了SpringBoot?如何將配置文件掛到?jar?包外面,需要的朋友可以參考下
    2023-03-03
  • Java中定時(shí)器Timer和TimerTask使用方法全解析

    Java中定時(shí)器Timer和TimerTask使用方法全解析

    這篇文章主要介紹了Java中定時(shí)器Timer和TimerTask使用方法的相關(guān)資料,如何創(chuàng)建定時(shí)任務(wù)、安排任務(wù)執(zhí)行、取消任務(wù)以及實(shí)現(xiàn)任務(wù)的暫停和恢復(fù)功能,通過(guò)這些功能,可以靈活地控制任務(wù)的執(zhí)行,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • 完美解決gson將Integer默認(rèn)轉(zhuǎn)換成Double的問(wèn)題

    完美解決gson將Integer默認(rèn)轉(zhuǎn)換成Double的問(wèn)題

    下面小編就為大家?guī)?lái)一篇完美解決gson將Integer默認(rèn)轉(zhuǎn)換成Double的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • springboot FeignClient注解及參數(shù)

    springboot FeignClient注解及參數(shù)

    這篇文章主要介紹了springboot FeignClient注解及參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

瓮安县| 色达县| 拉萨市| 公主岭市| 洛隆县| 甘谷县| 岳阳市| 桃园县| 奈曼旗| 黔东| 扎鲁特旗| 太白县| 泾川县| 政和县| 迁西县| 平果县| 乐安县| 宣化县| 镇平县| 泰和县| 革吉县| 法库县| 泸州市| 四子王旗| 长武县| 河南省| 浪卡子县| 姜堰市| 社旗县| 海口市| 陇西县| 兴安盟| 肇源县| 德州市| 嘉义县| 怀安县| 汤原县| 庆安县| 东阿县| 滨州市| 卫辉市|