Java學習(21) -- 源碼閱讀(Integer)

一、Integer簡單介紹

1)、由於類修飾符中有關鍵字final,故該類不能夠被繼承
2)、繼承了抽象類Number
3)、實現了接口Comparable,即實現了compareTo方法
4)、重寫了hashCode和equals方法,其中hashCode是value,而equals只是比較同種類型的intValue的值

二、屬性

//值爲 (-(2的31次方)) 的常量,它表示 int 類型能夠表示的最小值。
public static final int   MIN_VALUE = 0x80000000;
//值爲 ((2的31次方)-1) 的常量,它表示 int 類型能夠表示的最大值。
public static final int   MAX_VALUE = 0x7fffffff;   
//表示基本類型 int 的 Class 實例。
public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
//用來以二進制補碼形式表示 int 值的比特位數。
public static final int SIZE = 32;
//用來以二進制補碼形式表示 int 值的字節數。1.8以後纔有
public static final int BYTES = SIZE / Byte.SIZE;

三、方法

1)構造方法

public Integer(int value) {
        this.value = value;
    }
public Integer(String s) throws NumberFormatException {
        this.value = parseInt(s, 10);
    }

2) 將int類型轉換爲Integer

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

3)String轉成Integer(int)的方法

Integer getInteger(String nm)
Integer getInteger(String nm, int val)
Integer getInteger(String nm, Integer val)
Integer decode(String nm)
Integer valueOf(String s)
Integer valueOf(String s, int radix)
int parseUnsignedInt(String s)
int parseUnsignedInt(String s, int radix)
int parseInt(String s)
int parseInt(String s, int radix)

 以上所有方法都能實現將String類型的值轉成Integer(int)類型(如果 String 不包含可解析整數將拋出NumberFormatException)
可以說,所有將String轉成Integer的方法都是基於parseInt方法實現的。簡單看一下以上部分方法的調用棧。

getInteger(String nm) ---> getInteger(nm, null);--->Integer.decode()--->Integer.valueOf()--->parseInt()

4) getInteger

確定具有指定名稱的系統屬性的整數值。 第一個參數被視爲系統屬性的名稱。通過System.getProperty(java.lang.String) 方法可以訪問系統屬性。然後,將該屬性的字符串值解釋爲一個整數值,並返回表示該值的 Integer 對象。使用 getProperty 的定義可以找到可能出現的數字格式的詳細信息。其中參數nm應該在System的props中可以找到。這個方法在日常編碼中很好是用到。在代碼中可以用以下形式使用該方法:

Properties props = System.getProperties();
props.put("hollis.integer.test.key","10000");
Integer i = Integer.getInteger("hollis.integer.test.key");
System.out.println(i);
//另外兩種方法
getInteger(String nm,int val)
getInteger(String nm, Integer val)

第二個參數是默認值。如果未具有指定名稱的屬性,或者屬性的數字格式不正確,或者指定名稱爲空或 null,則返回默認值。 

public static Integer getInteger(String nm, Integer val) {
        String v = null;
        try {
            v = System.getProperty(nm);
        } catch (IllegalArgumentException | NullPointerException e) {
        }
        if (v != null) {
            try {
                return Integer.decode(v);
            } catch (NumberFormatException e) {
            }
        }
        return val;
    }

 先按照nm作爲key從系統配置中取出值,然後調用Integer.decode方法將其轉換成整數並返回。

5)public static Integer decode(String nm)

public static Integer decode(String nm) throws NumberFormatException {
        int radix = 10;
        int index = 0;
        boolean negative = false;
        Integer result;

        if (nm.length() == 0)
            throw new NumberFormatException("Zero length string");
        char firstChar = nm.charAt(0);
        // Handle sign, if present
        if (firstChar == '-') {
            negative = true;
            index++;
        } else if (firstChar == '+')
            index++;

        // Handle radix specifier, if present
        if (nm.startsWith("0x", index) || nm.startsWith("0X", index)) {
            index += 2;
            radix = 16;
        }
        else if (nm.startsWith("#", index)) {
            index ++;
            radix = 16;
        }
        else if (nm.startsWith("0", index) && nm.length() > 1 + index) {
            index ++;
            radix = 8;
        }

        if (nm.startsWith("-", index) || nm.startsWith("+", index))
            throw new NumberFormatException("Sign character in wrong position");

        try {
            result = Integer.valueOf(nm.substring(index), radix);
            result = negative ? Integer.valueOf(-result.intValue()) : result;
        } catch (NumberFormatException e) {
            // If number is Integer.MIN_VALUE, we'll end up here. The next line
            // handles this case, and causes any genuine format error to be
            // rethrown.
            String constant = negative ? ("-" + nm.substring(index))
                                       : nm.substring(index);
            result = Integer.valueOf(constant, radix);
        }
        return result;
    }

該方法的作用是將 String 解碼爲 Integer。接受十進制、十六進制和八進制數字。
根據要解碼的 String(mn)的形式轉成不同進制的數字。 mn由三部分組成:符號、基數說明符和字符序列。 
—0X123-是符號位,0X是基數說明符(0表示八進制,0x,0X,#表示十六進制,什麼都不寫則表示十進制),123是數字字符序列。

6)valueOf

public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }

返回一個 Integer 對象。如果指定第二個參數radix,將第一個參數解釋爲用第二個參數指定的基數表示的有符號整數。如果沒指定則按照十進制進行處理。

7)parseInt

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

public static int parseInt(String s, int radix) throws NumberFormatException

使用第二個參數指定的基數(如果沒指定,則按照十進制處理),將字符串參數解析爲有符號的整數。除了第一個字符可以是用來表示負值的 ASCII 減號 ‘-‘ (‘\u002D’)外,字符串中的字符必須都是指定基數的數字(通過 Character.digit(char, int) 是否返回一個負值確定)。返回得到的整數值。如果發生以下任意一種情況,則拋出一個 NumberFormatException 類型的異常:

“12345”按照十進制轉成12345的方法其實就是以下方式: ((1*10)+2)*10)+3)*10+4)*10+5 具體的如何依次取出“12345”中的每一個字符並將起轉成不同進制int類型則是Character.digit方法實現的,這裏就不深入講解了。

8)compareTo方法

在看是介紹Interger的類定義的時候介紹過,Integer類實現了Comparable<Integer>接口,所以Integer對象可以和另外一個Integer對象進行比較。

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章