{} Integer 是用 final 聲明的常量類,不能被任何類所繼承。并且 Integer 類繼承了 Number 類和實現了 Comparable 接口。Number 類是一個抽象類,8種基本數據類型的包裝類除了Character 和 Boolean 沒有繼承該類外,剩下的都繼承了 Number 類,該類的方法用于各種數據類型的轉換。Compar" />

在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Integer的主要屬性

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-13 11:46 ? 次閱讀

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

1. Integer 的聲明

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

Integer 是用 final 聲明的常量類,不能被任何類所繼承。并且 Integer 類繼承了 Number 類和實現了 Comparable 接口。Number 類是一個抽象類,8種基本數據類型的包裝類除了Character 和 Boolean 沒有繼承該類外,剩下的都繼承了 Number 類,該類的方法用于各種數據類型的轉換。Comparable 接口就一個 compareTo 方法,用于元素之間的大小比較,下面會對這些方法詳細展開介紹。

2. Integer 的主要屬性

圖片

圖片int 類型在 Java 中是占據 4 個字節,所以其可以表示大小的范圍是 -2^31——2^31 -1即 -2147483648——2147483647,我們在用 int 表示數值時一定不要超出這個范圍了。

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

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

對于第二個構造方法 Integer(String) 就是將我們輸入的字符串數據轉換成整型數據。

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

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

public static int parseInt(String s, int radix) throws NumberFormatException{
    //如果轉換的字符串如果為null,直接拋出空指針異常
    if (s == null) {
        throw new NumberFormatException("null");
    }
    //如果轉換的radix(默認是10)< 2 則拋出數字格式異常,因為進制最小是 2 進制
    if (radix < Character.MIN_RADIX) {
        throw new NumberFormatException("radix " + radix +
                                        " less than Character.MIN_RADIX");
    }
    //如果轉換的radix(默認是10) >36 則拋出數字格式異常,因為0到9一共10位,a到z一共26位,所以一共36位
    //也就是最高只能有36進制數
    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是待轉換字符串的長度
    int limit = -Integer.MAX_VALUE;//limit = -2147483647
    int multmin;
    int digit;
    //如果待轉換字符串長度大于 0 
    if (len > 0) {
        char firstChar = s.charAt(0);//獲取待轉換字符串的第一個字符
        //這里主要用來判斷第一個字符是"+"或者"-",因為這兩個字符的 ASCII碼都小于字符'0'
        if (firstChar < '0') {  
            if (firstChar == '-') {//如果第一個字符是'-'
                negative = true;
                limit = Integer.MIN_VALUE;
            } else if (firstChar != '+')//如果第一個字符是不是 '+',直接拋出異常
                throw NumberFormatException.forInputString(s);

            if (len == 1) //待轉換字符長度是1,不能是單獨的"+"或者"-",否則拋出異常 
                throw NumberFormatException.forInputString(s);
            i++;
        }
        multmin = limit / radix;
        //通過不斷循環,將字符串除掉第一個字符之后,根據進制不斷相乘在相加得到一個正整數
        //比如 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 {//如果待轉換字符串長度小于等于0,直接拋出異常
        throw NumberFormatException.forInputString(s);
    }
    //根據第一個字符得到的正負號,在結果前面加上符號
    return negative ? result : -result;
}

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

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

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) 方法內部調用了 stringSize() 和 getChars() 方法,stringSize() 它是用來計算參數 i 的位數也就是轉成字符串之后的字符串的長度,內部結合一個已經初始化好的int類型的數組sizeTable來完成這個計算。

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;
    }

實現的形式很巧妙。注意負數包含符號位,所以對于負數的位數是 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:被初始化的數字,

index:這個數字的長度(包含了負數的符號“-”),

buf:字符串的容器-一個char型數組。

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

5. 自動拆箱和裝箱

自動拆箱和自動裝箱是 JDK1.5 以后才有的功能,也就是java當中眾多的語法糖之一,它的執行是在編譯期,會根據代碼的語法,在生成class文件的時候,決定是否進行拆箱和裝箱動作。

①、自動裝箱

我們知道一般創建一個類的對象需要通過 new 關鍵字,比如:

Object obj = new Object();

但是實際上,對于 Integer 類,我們卻可以直接這樣使用:

Integer a = 128;

為什么可以這樣,通過反編譯工具,我們可以看到,生成的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);
}

其實最后返回的也是通過new Integer() 產生的對象,但是這里要注意前面的一段代碼,當i的值 -128 <= i <= 127 返回的是緩存類中的對象,并沒有重新創建一個新的對象,這在通過 equals 進行比較的時候我們要注意。

這就是基本數據類型的自動裝箱,128是基本數據類型,然后被解析成Integer類。

②、自動拆箱

我們將 Integer 類表示的數據賦值給基本數據類型int,就執行了自動拆箱。

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

反編譯生成的class文件:

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

簡單來講:自動裝箱就是Integer.valueOf(int i);自動拆箱就是 i.intValue();

6. equals(Object obj)方法

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

這個方法很簡單,先通過 instanceof 關鍵字判斷兩個比較對象的關系,然后將對象強轉為 Integer,再通過自動拆箱,轉換成兩個基本數據類 int,然后通過 == 比較。

7. hashCode() 方法

public int hashCode() {
         return value;
     }

Integer 類的hashCode 方法也比較簡單,直接返回其 int 類型的數據。

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

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

這兩個方法我們在介紹 構造函數 Integer(String s) 時已經詳細講解了。

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

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

compareTo 方法內部直接調用 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. 小結

好了,這就是JDK中java.lang.Integer類的源碼解析,隨著JDK的更新,該類應該還會有變化,文章也會實時更新。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8685

    瀏覽量

    151655
  • 數據
    +關注

    關注

    8

    文章

    7128

    瀏覽量

    89365
  • JAVA
    +關注

    關注

    19

    文章

    2973

    瀏覽量

    104947
收藏 人收藏

    評論

    相關推薦

    HarmonyOS實戰開發-如何通過BlendMode屬性來實現掛件和圖片的混合

    介紹 本實例主要通過BlendMode屬性來實現掛件和圖片的混合,通過更改不同的混合參數,能夠展示不同的混合效果。 效果圖預覽 使用說明 : 進入頁面,點擊掛件區域,進行掛件和圖片的混合,點擊
    發表于 05-07 14:45

    integer 用法

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

    嵌入式FRAM的主要技術屬性是什么?

    隨機存取存儲器(FRAM)是一種非易失性的獨立型存儲技術,本文將論述FRAM的主要技術屬性,同時探討可充分展現FRAM優勢的具體用例。
    發表于 08-22 06:16

    Gowin Integer Division IP用戶使用指南

    Gowin? Integer Division IP 用戶指南主要內容包括功能特點、端口描述、時序說明、配置調用、參考設計等。主要用于幫助用戶快速了解Gowin Integer Div
    發表于 09-30 06:38

    Gowin Integer Multiply Divider快速用戶指南

    Gowin Integer Multiply Divider IP 用戶指南主要內容包括產品特征、功能描述、端口描述、時序說明、配置調用、參考設計等,旨在幫助用戶快速了解 Gowin Integer Multiply Divid
    發表于 10-09 07:06

    Gowin Integer Multiply Divider用戶指南

    本次發布 Gowin Integer Multiply Divider IP 用戶指南。Gowin Integer Multiply Divider IP 的用戶指南可在高云官網下載。其中,參考設計已配置一例特定參數,可用于仿真,實例化加插用戶設計后的總綜合,總布局布線。
    發表于 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
    發表于 04-13 12:10 ?33次下載
    MAX2870 Fractional_<b class='flag-5'>Integer</b>-N Synthesizer_VCO

    labview屬性節點教程,屬性節點有什么作用?

    控件的大部分屬性都可以通過屬性對話框ā行設置,對于未包括的屬性則需要通過屬性節點來編程操作了。屬性節點用于訪問對象的
    發表于 08-13 08:00 ?0次下載
    labview<b class='flag-5'>屬性</b>節點教程,<b class='flag-5'>屬性</b>節點有什么作用?

    Visual C++程序設計教程之屬性單和屬性頁的詳細資料說明

    本文檔詳細介紹的是Visual C++程序設計教程之屬性單和屬性頁的詳細資料說明主要內容包括了:1 屬性單和屬性頁相關類,2 創建
    發表于 03-04 16:21 ?4次下載
    Visual C++程序設計教程之<b class='flag-5'>屬性</b>單和<b class='flag-5'>屬性</b>頁的詳細資料說明

    LabVIEW的屬性節點教學

    本文檔的主要內容詳細介紹的是LabVIEW初級教程之屬性節點初級課程的詳細資料說明。
    發表于 03-29 15:24 ?32次下載
    LabVIEW的<b class='flag-5'>屬性</b>節點教學

    Gowin Integer Division IP用戶指南

    Gowin? Integer Division IP 用戶指南主要內容包括功能特點、端口 描述、時序說明、配置調用、參考設計等。主要用于幫助用戶快速了解 Gowin Integer
    發表于 09-15 11:07 ?3次下載
    Gowin <b class='flag-5'>Integer</b> Division IP用戶指南

    Gowin Integer Multiply Divider IP用戶指南

    Gowin Integer Multiply Divider IP 用戶指南主要內容包括產品特征、功 能描述、端口描述、時序說明、配置調用、參考設計等,旨在幫助用戶快速 了解 Gowin Integer Multiply D
    發表于 09-15 09:58 ?0次下載
    Gowin <b class='flag-5'>Integer</b> Multiply Divider IP用戶指南

    DWDM系統光接口及主要屬性介紹

    DWDM系統的光接口是根據一-些同樣適用于轉發器和400G QSFP-DD DCO可插拔接口的關鍵屬性定義的。對于后者,這些屬性由標準機構和行業組織指定,包括OIF 400ZR規范和OpenZR+多源協議(MSA)。
    發表于 04-26 10:23 ?555次閱讀

    BlockingQueue主要屬性和構造函數

    InterruptedException ; boolean remove (Object o) ; 一起來看看,ArrayBlockingQueue 是如何實現的吧。 初識 首先看一下 ArrayBlockingQueue 的主要屬性和構造函數。
    的頭像 發表于 10-13 11:36 ?387次閱讀

    placeholder屬性和value屬性的差別

    在現代的Web設計和開發中,表單是至關重要的元素之一。與此同時,placeholder屬性和value屬性在表單中扮演著重要的角色。本文將詳細探討這兩個屬性的區別,深入探究它們在不同場景下的應用及其
    的頭像 發表于 11-30 10:13 ?1875次閱讀
    主站蜘蛛池模板: 欧美性色黄在线视| 久久人成| 午夜精品福利在线| 五月亭亭免费高清在线| 性色综合| 色天网站| 免费人成动漫在线播放r18| 免费看很黄很色裸乳视频| 久久久久久久久综合| 国产片一级特黄aa的大片| www.亚洲天堂| 天天干天天拍天天射| 免费的三及片| 欧美ol丝袜高跟秘书在线观看| 亚洲男人的天堂久久香蕉| 美女无遮挡拍拍拍免费视频| 亚洲性色成人| 日韩免费观看视频| 精品欧美一区二区三区| www.乱| 色综合天天综合网站中国| 国产一级毛片午夜| 性黄视频| 天堂网2021天堂手机版丶| 久久免| 永久影视| 日本综合视频| 免费看啪| 伊人久久大香线蕉资源| 日本三级免费看| 狠狠狠狠操| 天天操天天射天天爽| 午夜免费片在线观看不卡| 91夜夜人人揉人人捏人人添| 天天射天天怕| 又黄又免费的网站| 黄网站色视频免费看无下截| 色综合一区二区三区| 涩涩涩丁香色婷五月网视色| 男人的天堂视频网站清风阁| bt 电影天堂|