{} Integer 是用 final 聲明的常量類,不能被任何類所繼承。并且 Integer 類繼承了 Number 類和實(shí)現(xiàn)了 Comparable 接口。Number 類是一個(gè)抽象類,8種基本數(shù)據(jù)類型的包裝類除了Character 和 Boolean 沒(méi)有繼承該類外,剩下的都繼承了 Number 類,該類的方法用于各種數(shù)據(jù)類型的轉(zhuǎn)換。Compar" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Integer的主要屬性

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-13 11:46 ? 次閱讀

前面介紹了 java.lang 包下的 Object 類,這是所有類的父類。本篇文章接著介紹該包下的另一個(gè)也很常用的類 Integer。

1. Integer 的聲明

public final class Integer extends Number implements Comparable< Integer >{}

Integer 是用 final 聲明的常量類,不能被任何類所繼承。并且 Integer 類繼承了 Number 類和實(shí)現(xiàn)了 Comparable 接口。Number 類是一個(gè)抽象類,8種基本數(shù)據(jù)類型的包裝類除了Character 和 Boolean 沒(méi)有繼承該類外,剩下的都繼承了 Number 類,該類的方法用于各種數(shù)據(jù)類型的轉(zhuǎn)換。Comparable 接口就一個(gè) compareTo 方法,用于元素之間的大小比較,下面會(huì)對(duì)這些方法詳細(xì)展開(kāi)介紹。

2. Integer 的主要屬性

圖片

圖片int 類型在 Java 中是占據(jù) 4 個(gè)字節(jié),所以其可以表示大小的范圍是 -2^31——2^31 -1即 -2147483648——2147483647,我們?cè)谟?int 表示數(shù)值時(shí)一定不要超出這個(gè)范圍了。

3. 構(gòu)造方法 Integer(int)、Integer(String)

public Integer(int var1) {
    this.value = var1;
}

對(duì)于第二個(gè)構(gòu)造方法 Integer(String) 就是將我們輸入的字符串?dāng)?shù)據(jù)轉(zhuǎn)換成整型數(shù)據(jù)。

首先我們必須要知道能轉(zhuǎn)換成整數(shù)的字符串必須分為兩個(gè)部分:第一位必須是"+"或者"-",剩下的必須是 0-9 和 a-z 字符

public Integer(String s) throws NumberFormatException {
    this.value = parseInt(s, 10);//首先調(diào)用parseInt(s,10)方法,其中s表示我們需要轉(zhuǎn)換的字符串,10表示以十進(jìn)制輸出,默認(rèn)也是10進(jìn)制
}

public static int parseInt(String s, int radix) throws NumberFormatException{
    //如果轉(zhuǎn)換的字符串如果為null,直接拋出空指針異常
    if (s == null) {
        throw new NumberFormatException("null");
    }
    //如果轉(zhuǎn)換的radix(默認(rèn)是10)< 2 則拋出數(shù)字格式異常,因?yàn)檫M(jìn)制最小是 2 進(jìn)制
    if (radix < Character.MIN_RADIX) {
        throw new NumberFormatException("radix " + radix +
                                        " less than Character.MIN_RADIX");
    }
    //如果轉(zhuǎn)換的radix(默認(rèn)是10) >36 則拋出數(shù)字格式異常,因?yàn)?到9一共10位,a到z一共26位,所以一共36位
    //也就是最高只能有36進(jìn)制數(shù)
    if (radix > Character.MAX_RADIX) {
        throw new NumberFormatException("radix " + radix +
                                        " greater than Character.MAX_RADIX");
    }
    int result = 0;
    boolean negative = false;
    int i = 0, len = s.length();//len是待轉(zhuǎn)換字符串的長(zhǎng)度
    int limit = -Integer.MAX_VALUE;//limit = -2147483647
    int multmin;
    int digit;
    //如果待轉(zhuǎn)換字符串長(zhǎng)度大于 0 
    if (len > 0) {
        char firstChar = s.charAt(0);//獲取待轉(zhuǎn)換字符串的第一個(gè)字符
        //這里主要用來(lái)判斷第一個(gè)字符是"+"或者"-",因?yàn)檫@兩個(gè)字符的 ASCII碼都小于字符'0'
        if (firstChar < '0') {  
            if (firstChar == '-') {//如果第一個(gè)字符是'-'
                negative = true;
                limit = Integer.MIN_VALUE;
            } else if (firstChar != '+')//如果第一個(gè)字符是不是 '+',直接拋出異常
                throw NumberFormatException.forInputString(s);

            if (len == 1) //待轉(zhuǎn)換字符長(zhǎng)度是1,不能是單獨(dú)的"+"或者"-",否則拋出異常 
                throw NumberFormatException.forInputString(s);
            i++;
        }
        multmin = limit / radix;
        //通過(guò)不斷循環(huán),將字符串除掉第一個(gè)字符之后,根據(jù)進(jìn)制不斷相乘在相加得到一個(gè)正整數(shù)
        //比如 parseInt("2abc",16) = 2*16的3次方+10*16的2次方+11*16+12*1 
        //parseInt("123",10) = 1*10的2次方+2*10+3*1 
        while (i < len) {
            digit = Character.digit(s.charAt(i++),radix);
            if (digit < 0) {
                throw NumberFormatException.forInputString(s);
            }
            if (result < multmin) {
                throw NumberFormatException.forInputString(s);
            }
            result *= radix;
            if (result < limit + digit) {
                throw NumberFormatException.forInputString(s);
            }
            result -= digit;
        }
    } else {//如果待轉(zhuǎn)換字符串長(zhǎng)度小于等于0,直接拋出異常
        throw NumberFormatException.forInputString(s);
    }
    //根據(jù)第一個(gè)字符得到的正負(fù)號(hào),在結(jié)果前面加上符號(hào)
    return negative ? result : -result;
}

4. toString()、toString(int i)、toString(int i, int radix)

這三個(gè)方法重載,能返回一個(gè)整型數(shù)據(jù)所表示的字符串形式,其中最后一個(gè)方法 toString(int,int) 第二個(gè)參數(shù)是表示的進(jìn)制數(shù)。

public String toString() {
    return toString(value);
}

public static String toString(int i) {
    if (i == Integer.MIN_VALUE)
        return "-2147483648";
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    getChars(i, size, buf);
    return new String(buf, true);
}

toString(int) 方法內(nèi)部調(diào)用了 stringSize() 和 getChars() 方法,stringSize() 它是用來(lái)計(jì)算參數(shù) i 的位數(shù)也就是轉(zhuǎn)成字符串之后的字符串的長(zhǎng)度,內(nèi)部結(jié)合一個(gè)已經(jīng)初始化好的int類型的數(shù)組sizeTable來(lái)完成這個(gè)計(jì)算。

final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                      99999999, 999999999, Integer.MAX_VALUE };

    // Requires positive x
    static int stringSize(int x) {
        for (int i=0; ; i++)
            if (x <= sizeTable[i])
                return i+1;
    }

實(shí)現(xiàn)的形式很巧妙。注意負(fù)數(shù)包含符號(hào)位,所以對(duì)于負(fù)數(shù)的位數(shù)是 stringSize(-i) + 1。

再看 getChars 方法:

static void getChars(int i, int index, char[] buf) {
        int q, r;
        int charPos = index;
        char sign = 0;

        if (i < 0) {
            sign = '-';
            i = -i;
        }

        // Generate two digits per iteration
        while (i >= 65536) {
            q = i / 100;
        // really: r = i - (q * 100);
            r = i - ((q < < 6) + (q < < 5) + (q < < 2));
            i = q;
            buf [--charPos] = DigitOnes[r];
            buf [--charPos] = DigitTens[r];
        }

        // Fall thru to fast mode for smaller numbers
        // assert(i <= 65536, i);
        for (;;) {
            q = (i * 52429) > >> (16+3);
            r = i - ((q < < 3) + (q < < 1));  // r = i-(q*10) ...
            buf [--charPos] = digits [r];
            i = q;
            if (i == 0) break;
        }
        if (sign != 0) {
            buf [--charPos] = sign;
        }
    }

i:被初始化的數(shù)字,

index:這個(gè)數(shù)字的長(zhǎng)度(包含了負(fù)數(shù)的符號(hào)“-”),

buf:字符串的容器-一個(gè)char型數(shù)組。

第一個(gè)if判斷,如果i<0,sign記下它的符號(hào)“-”,同時(shí)將i轉(zhuǎn)成整數(shù)。下面所有的操作也就只針對(duì)整數(shù)了,最后在判斷sign如果不等于零將 sign 的值放在char數(shù)組的首位buf [--charPos] = sign;。

5. 自動(dòng)拆箱和裝箱

自動(dòng)拆箱和自動(dòng)裝箱是 JDK1.5 以后才有的功能,也就是java當(dāng)中眾多的語(yǔ)法糖之一,它的執(zhí)行是在編譯期,會(huì)根據(jù)代碼的語(yǔ)法,在生成class文件的時(shí)候,決定是否進(jìn)行拆箱和裝箱動(dòng)作。

①、自動(dòng)裝箱

我們知道一般創(chuàng)建一個(gè)類的對(duì)象需要通過(guò) new 關(guān)鍵字,比如:

Object obj = new Object();

但是實(shí)際上,對(duì)于 Integer 類,我們卻可以直接這樣使用:

Integer a = 128;

為什么可以這樣,通過(guò)反編譯工具,我們可以看到,生成的class文件是:

Integer a = Integer.valueOf(128);

我們可以看看 valueOf() 方法

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

其實(shí)最后返回的也是通過(guò)new Integer() 產(chǎn)生的對(duì)象,但是這里要注意前面的一段代碼,當(dāng)i的值 -128 <= i <= 127 返回的是緩存類中的對(duì)象,并沒(méi)有重新創(chuàng)建一個(gè)新的對(duì)象,這在通過(guò) equals 進(jìn)行比較的時(shí)候我們要注意。

這就是基本數(shù)據(jù)類型的自動(dòng)裝箱,128是基本數(shù)據(jù)類型,然后被解析成Integer類。

②、自動(dòng)拆箱

我們將 Integer 類表示的數(shù)據(jù)賦值給基本數(shù)據(jù)類型int,就執(zhí)行了自動(dòng)拆箱。

Integer a = new Integer(128);
 int m = a;

反編譯生成的class文件:

Integer a = new Integer(128);
 int m = a.intValue();

簡(jiǎn)單來(lái)講:自動(dòng)裝箱就是Integer.valueOf(int i);自動(dòng)拆箱就是 i.intValue();

6. equals(Object obj)方法

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

這個(gè)方法很簡(jiǎn)單,先通過(guò) instanceof 關(guān)鍵字判斷兩個(gè)比較對(duì)象的關(guān)系,然后將對(duì)象強(qiáng)轉(zhuǎn)為 Integer,再通過(guò)自動(dòng)拆箱,轉(zhuǎn)換成兩個(gè)基本數(shù)據(jù)類 int,然后通過(guò) == 比較。

7. hashCode() 方法

public int hashCode() {
         return value;
     }

Integer 類的hashCode 方法也比較簡(jiǎn)單,直接返回其 int 類型的數(shù)據(jù)。

8. parseInt(String s) 和 parseInt(String s, int radix) 方法

前面通過(guò) toString(int i) 可以將整型數(shù)據(jù)轉(zhuǎn)換成字符串類型輸出,這里通過(guò) parseInt(String s) 能將字符串轉(zhuǎn)換成整型輸出。

這兩個(gè)方法我們?cè)诮榻B 構(gòu)造函數(shù) Integer(String s) 時(shí)已經(jīng)詳細(xì)講解了。

9. compareTo(Integer anotherInteger) 和 compare(int x, int y) 方法

public int compareTo(Integer anotherInteger) {
         return compare(this.value, anotherInteger.value);
     }

compareTo 方法內(nèi)部直接調(diào)用 compare 方法:

public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
     }

如果 x < y 返回 -1

如果 x == y 返回 0

如果 x > y 返回 1

System.out.println(Integer.compare(1, 2));//-1
 System.out.println(Integer.compare(1, 1));//0
 System.out.println(Integer.compare(1, 0));//1

10. 小結(jié)

好了,這就是JDK中java.lang.Integer類的源碼解析,隨著JDK的更新,該類應(yīng)該還會(huì)有變化,文章也會(huì)實(shí)時(shí)更新。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8381

    瀏覽量

    150580
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6772

    瀏覽量

    88655
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2948

    瀏覽量

    104391
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS實(shí)戰(zhàn)開(kāi)發(fā)-如何通過(guò)BlendMode屬性來(lái)實(shí)現(xiàn)掛件和圖片的混合

    介紹 本實(shí)例主要通過(guò)BlendMode屬性來(lái)實(shí)現(xiàn)掛件和圖片的混合,通過(guò)更改不同的混合參數(shù),能夠展示不同的混合效果。 效果圖預(yù)覽 使用說(shuō)明 : 進(jìn)入頁(yè)面,點(diǎn)擊掛件區(qū)域,進(jìn)行掛件和圖片的混合,點(diǎn)擊
    發(fā)表于 05-07 14:45

    integer 用法

    最近 , 寫(xiě)了一個(gè)測(cè)試uart程序的testbench,在testbench中使用 了 integer,用于for循環(huán),但是modelsim仿真 波形中,integer 值一直為 未知,找了好多資料
    發(fā)表于 05-24 20:56

    嵌入式FRAM的主要技術(shù)屬性是什么?

    隨機(jī)存取存儲(chǔ)器(FRAM)是一種非易失性的獨(dú)立型存儲(chǔ)技術(shù),本文將論述FRAM的主要技術(shù)屬性,同時(shí)探討可充分展現(xiàn)FRAM優(yōu)勢(shì)的具體用例。
    發(fā)表于 08-22 06:16

    Gowin Integer Division IP用戶使用指南

    Gowin? Integer Division IP 用戶指南主要內(nèi)容包括功能特點(diǎn)、端口描述、時(shí)序說(shuō)明、配置調(diào)用、參考設(shè)計(jì)等。主要用于幫助用戶快速了解Gowin Integer Div
    發(fā)表于 09-30 06:38

    Gowin Integer Multiply Divider快速用戶指南

    Gowin Integer Multiply Divider IP 用戶指南主要內(nèi)容包括產(chǎn)品特征、功能描述、端口描述、時(shí)序說(shuō)明、配置調(diào)用、參考設(shè)計(jì)等,旨在幫助用戶快速了解 Gowin Integer Multiply Divid
    發(fā)表于 10-09 07:06

    Gowin Integer Multiply Divider用戶指南

    本次發(fā)布 Gowin Integer Multiply Divider IP 用戶指南。Gowin Integer Multiply Divider IP 的用戶指南可在高云官網(wǎng)下載。其中,參考設(shè)計(jì)已配置一例特定參數(shù),可用于仿真,實(shí)例化加插用戶設(shè)計(jì)后的總綜合,總布局布線。
    發(fā)表于 10-09 06:35

    MAX2870 Fractional_Integer-N Synthesizer_VCO

    (VCOs) capable of operating in both integer-N andfractional-N modes. When combined with an externalreference oscillator and loop filter, the
    發(fā)表于 04-13 12:10 ?33次下載
    MAX2870 Fractional_<b class='flag-5'>Integer</b>-N Synthesizer_VCO

    labview屬性節(jié)點(diǎn)教程,屬性節(jié)點(diǎn)有什么作用?

    控件的大部分屬性都可以通過(guò)屬性對(duì)話框ā行設(shè)置,對(duì)于未包括的屬性則需要通過(guò)屬性節(jié)點(diǎn)來(lái)編程操作了。屬性節(jié)點(diǎn)用于訪問(wèn)對(duì)象的
    發(fā)表于 08-13 08:00 ?0次下載
    labview<b class='flag-5'>屬性</b>節(jié)點(diǎn)教程,<b class='flag-5'>屬性</b>節(jié)點(diǎn)有什么作用?

    Visual C++程序設(shè)計(jì)教程之屬性單和屬性頁(yè)的詳細(xì)資料說(shuō)明

    本文檔詳細(xì)介紹的是Visual C++程序設(shè)計(jì)教程之屬性單和屬性頁(yè)的詳細(xì)資料說(shuō)明主要內(nèi)容包括了:1 屬性單和屬性頁(yè)相關(guān)類,2 創(chuàng)建
    發(fā)表于 03-04 16:21 ?4次下載
    Visual C++程序設(shè)計(jì)教程之<b class='flag-5'>屬性</b>單和<b class='flag-5'>屬性</b>頁(yè)的詳細(xì)資料說(shuō)明

    LabVIEW的屬性節(jié)點(diǎn)教學(xué)

    本文檔的主要內(nèi)容詳細(xì)介紹的是LabVIEW初級(jí)教程之屬性節(jié)點(diǎn)初級(jí)課程的詳細(xì)資料說(shuō)明。
    發(fā)表于 03-29 15:24 ?31次下載
    LabVIEW的<b class='flag-5'>屬性</b>節(jié)點(diǎn)教學(xué)

    Gowin Integer Division IP用戶指南

    Gowin? Integer Division IP 用戶指南主要內(nèi)容包括功能特點(diǎn)、端口 描述、時(shí)序說(shuō)明、配置調(diào)用、參考設(shè)計(jì)等。主要用于幫助用戶快速了解 Gowin Integer
    發(fā)表于 09-15 11:07 ?3次下載
    Gowin <b class='flag-5'>Integer</b> Division IP用戶指南

    Gowin Integer Multiply Divider IP用戶指南

    Gowin Integer Multiply Divider IP 用戶指南主要內(nèi)容包括產(chǎn)品特征、功 能描述、端口描述、時(shí)序說(shuō)明、配置調(diào)用、參考設(shè)計(jì)等,旨在幫助用戶快速 了解 Gowin Integer Multiply D
    發(fā)表于 09-15 09:58 ?0次下載
    Gowin <b class='flag-5'>Integer</b> Multiply Divider IP用戶指南

    DWDM系統(tǒng)光接口及主要屬性介紹

    DWDM系統(tǒng)的光接口是根據(jù)一-些同樣適用于轉(zhuǎn)發(fā)器和400G QSFP-DD DCO可插拔接口的關(guān)鍵屬性定義的。對(duì)于后者,這些屬性由標(biāo)準(zhǔn)機(jī)構(gòu)和行業(yè)組織指定,包括OIF 400ZR規(guī)范和OpenZR+多源協(xié)議(MSA)。
    發(fā)表于 04-26 10:23 ?506次閱讀

    BlockingQueue主要屬性和構(gòu)造函數(shù)

    InterruptedException ; boolean remove (Object o) ; 一起來(lái)看看,ArrayBlockingQueue 是如何實(shí)現(xiàn)的吧。 初識(shí) 首先看一下 ArrayBlockingQueue 的主要屬性和構(gòu)造函數(shù)。
    的頭像 發(fā)表于 10-13 11:36 ?321次閱讀

    placeholder屬性和value屬性的差別

    在現(xiàn)代的Web設(shè)計(jì)和開(kāi)發(fā)中,表單是至關(guān)重要的元素之一。與此同時(shí),placeholder屬性和value屬性在表單中扮演著重要的角色。本文將詳細(xì)探討這兩個(gè)屬性的區(qū)別,深入探究它們?cè)诓煌瑘?chǎng)景下的應(yīng)用及其
    的頭像 發(fā)表于 11-30 10:13 ?1550次閱讀