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

Java類型轉換valueOf與parseInt區(qū)別探討解析

 更新時間:2022年09月27日 11:26:55   作者:????????????  
這篇文章主要為大家介紹了Java類型轉換valueOf與parseInt區(qū)別探討解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

在編程中,遇到類型轉換,好像會經(jīng)常用到 parseIntvalueOf,當然這里只拿 Integer 類型進行陳述,其他類型也是雷同的;

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

區(qū)別

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

接下來,通過源碼進行逐一解析;  

parseInt

我們首先點進 parseInt() 方法中,

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

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

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

2、這里先是對字符串 s 是否為空,以及 radix 的大小進行一個判斷,不符合條件則拋出 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、接著往下,再一次對長度進行一個校驗,

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

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

Integer.parseInt("");

運行結果:

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、接下來會檢測第一個字符是啥,如果是 -,則將 negative 設置成 true,表示這是個負數(shù),并且將邊界 limit 設置成最小邊界;

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

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

++i 是因為如果第一位是符號的話,那么在后續(xù)的循環(huán)中追加數(shù)字則直接跳過首位;

 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ù)進制來調(diào)整邊界,以防越界;

int multmin = limit / radix;

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

然后就是進行計算;

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、最后判斷是否為負數(shù)完成轉換;

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) 則是一個 int 轉成 Integer 的自動裝箱;

接下來探究一下 IntegerCache ,可以看出這是 Integer 的成員內(nè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;
    }
}

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

總的來說,三個重構的 valueOf() 方法還是大同小異的:

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

以上就是Java 中 valueOf 和 parseInt 的區(qū)別探討解析的詳細內(nèi)容,更多關于Java valueOf與parseInt區(qū)別的資料請關注腳本之家其它相關文章!

相關文章

  • Java?LockSupport常用方法的源碼分析

    Java?LockSupport常用方法的源碼分析

    這篇文章主要為大家詳細介紹了Java?LockSupport類中的方法和部分源碼,以及面試常問到的一個小問題,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02
  • SpringData?Redis的具體使用

    SpringData?Redis的具體使用

    本文主要介紹了SpringData?Redis的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • 深入剖析java中String、StringBuffer、StringBuilder的區(qū)別

    深入剖析java中String、StringBuffer、StringBuilder的區(qū)別

    下面小編就為大家?guī)硪黄钊肫饰鰆ava中String、StringBuffer、StringBuilder的區(qū)別。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • Spring Security基于JWT實現(xiàn)SSO單點登錄詳解

    Spring Security基于JWT實現(xiàn)SSO單點登錄詳解

    這篇文章主要介紹了Spring Security基于JWT實現(xiàn)SSO單點登錄詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • Hutool開發(fā)MapUtil工具類使用示例

    Hutool開發(fā)MapUtil工具類使用示例

    這篇文章主要為大家介紹了Hutool開發(fā)MapUtil工具類使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Java編程 多態(tài)

    Java編程 多態(tài)

    這篇文章主要介紹了關于Java編程的多態(tài),多態(tài)通過分離做什么和怎么做,從另一個角度將接口和實現(xiàn)分離開來。構建可擴展的程序,需要的朋友可以參考下
    2021-10-10
  • 如何使用Code128字體將文本轉換為code128條形碼

    如何使用Code128字體將文本轉換為code128條形碼

    這篇文章主要介紹了如何使用Code128字體將文本轉換為code128條形碼 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • IntelliJ IDEA使用教程從入門到上癮(2019圖文版)

    IntelliJ IDEA使用教程從入門到上癮(2019圖文版)

    這篇文章主要介紹了IntelliJ IDEA使用教程從入門到上癮(2019圖文版),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 深入理解SpringBoot的配置環(huán)境屬性

    深入理解SpringBoot的配置環(huán)境屬性

    SpringBoot的配置環(huán)境屬性是一種強大的工具,可以幫助我們配置和管理我們的應用程序,這篇文章主要介紹了SpringBoot的配置環(huán)境屬性,需要的朋友可以參考下
    2023-07-07
  • 詳解基于redis實現(xiàn)分布式鎖

    詳解基于redis實現(xiàn)分布式鎖

    系統(tǒng)的不斷擴大,分布式鎖是最基本的保障。與單機的多線程不一樣的是,分布式跨多個機器。線程的共享變量無法跨機器。本文將介紹基于redis實現(xiàn)分布式鎖。
    2021-06-06

最新評論

汾阳市| 大邑县| 南部县| 建平县| 津南区| 潞城市| 和龙市| 嘉善县| 衡南县| 页游| 南投县| 罗城| 祁门县| 普兰店市| 乾安县| 江城| 灵武市| 兴业县| 迁安市| 张掖市| 临夏县| 荃湾区| 高要市| 巴林左旗| 集贤县| 阿克陶县| 宁武县| 循化| 双柏县| 兰西县| 靖边县| 平邑县| 石首市| 沙坪坝区| 闽侯县| 吴忠市| 灵宝市| 商都县| 巴中市| 鄂伦春自治旗| 汕尾市|