【Java】JDK源碼分析——Short

一.概述

Short是short的包裝類,表示兩個字節以內的整型數值。
Short.java中的相關代碼:

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

1.Short被final修飾,不能被繼承。
2.繼承了Number,可以實現數值間的轉換。
3.實現了Comparable<Short>接口,可以進行Short類型對象之間的比較。

二.源碼分析

1.全局變量

Short.java中的相關代碼:

    // short能表示的最小的值
	public static final short   MIN_VALUE = -32768;

	// short能表示的最大的值
	public static final short   MAX_VALUE = 32767;

	// 抑制沒有類型檢查而出現的警告
	@SuppressWarnings("unchecked")
	// Short類中對應的原始的short
	// Short.class和short.class不相等,但Short.TYPE和short.class相等
	public static final Class<Short>   TYPE = (Class<Short>) Class.getPrimitiveClass("short");

	// 用於保存short的值
	private final short value;

	// short佔的位數
	public static final int SIZE = 16;

	// 一個short數值佔的字節數
	public static final int BYTES = SIZE / Byte.SIZE;

	// 用於序列化
	private static final long serialVersionUID = 7515723908773894738L;

2.靜態內部類ShortCache

該類用於數值從-128到127的Short對象的緩存。
Short.java中的相關代碼:

private static class ShortCache {
		// 私有化構造方法
        private ShortCache(){}

        // 創建長度爲256的Short數組
        // 128表示128個負數,127爲127個正數,1表示0
        static final Short cache[] = new Short[-(-128) + 127 + 1];

        // 靜態初始化代碼塊
        static {
            // 循環填充數據
            for(int i = 0; i < cache.length; i++)
                // // 128爲偏置,數組0位置數值爲-128,255位置數值爲127
                cache[i] = new Short((short)(i - 128));
        }
}

3.構造方法

1)參數爲short

Short.java中的相關代碼:

	public Short(short value) {
    	// 保存數值到全局變量
        this.value = value;
	}

2)參數爲String

Short.java中的相關代碼:

	public Short(String s) throws NumberFormatException {
    	// 調用parseShort方法,作爲十進制數解析成short型數值
        this.value = parseShort(s, 10);
	}

4. parseShort方法

將帶有+、-號的字符串按十進制解析成short型數值。
Short.java中的相關代碼:

	public static short parseShort(String s) throws NumberFormatException {
    	// 調用重載方法
        return parseShort(s, 10);
    }

調用重載的parseByte方法。
指定進制對字符串進行解析。
Short.java中的相關代碼:

    public static short parseShort(String s, int radix)
        throws NumberFormatException {
        // 調用Integer的parseInt方法,解析成int型
        int i = Integer.parseInt(s, radix);
        // 判斷解析出的數值,是否滿足short型數值的範圍
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                "Value out of range. Value:\"" + s + "\" Radix:" + radix);
        // 若滿足,則進行類型轉換,並返回
        return (short)i;
 	}

5. valueOf方法

將String類型的對象轉換爲Short型。
Short.java中的相關代碼:

	public static Short valueOf(String s) throws NumberFormatException {
    	// 調用重載方法,並返回
        return valueOf(s, 10);
    }

調用了重載的valueOf方法。
指定進制對String對象進行轉換。
Short.java中的相關代碼:

    public static Short valueOf(String s, int radix)
        throws NumberFormatException {
        // 調用parseShort方法進行轉換
        // 轉換的結果作爲參數,調用重載方法,並返回
        return valueOf(parseShort(s, radix));
	}

調用了重載的valueOf方法。
Short.java中的相關代碼:

	public static Short valueOf(short s) {
    	// 128爲偏置
        final int offset = 128;
        // 轉換爲int類型數據
        int sAsInt = s;
        // 若滿足緩存範圍,則從緩存中獲取
        if (sAsInt >= -128 && sAsInt <= 127) {
            return ShortCache.cache[sAsInt + offset];
        }
        // 不滿足緩存範圍,則創建新對象
        return new Short(s);
	}

6. decode方法

對字符串形式的數值進行解析。
decode方法支持的字符串形式比parseShort方法更豐富。
支持不同進制的標識符(0x、#等)和小數形式等。
Short.java中的相關代碼:

	public static Short decode(String nm) throws NumberFormatException {
    	// 調用Integer的decode方法,解析成int型
        int i = Integer.decode(nm);
        // 判斷解析出的數據是否滿足byte型數值的範圍要求
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                    "Value " + i + " out of range from input " + nm);
		// 現進行類型轉換,再調用valueOf方法,從緩存中獲取數值
        return valueOf((short)i);
    }

7. byteValue方法

將當前short型的數值轉換爲byte類型的數值
Short.java中的相關代碼:

	public byte byteValue() {
    	// 進行類型轉換,並返回
        return (byte)value;
    }

8. shortValue方法

獲取當前short類型的數值
Short.java中的相關代碼:

	public short shortValue() {
    	// 直接返回
        return value;
    }

9. intValue方法

將當前short型的數值轉換爲int類型的數值。
Short.java中的相關代碼:

	public int intValue() {
    	// 進行類型轉換,並返回
        return (int)value;
	}

10. longValue方法

將當前short型的數值轉換爲long類型的數值。
Short.java中的相關代碼:

	public long longValue() {
    	// 進行類型轉換,並返回
        return (long)value;
	}

11. floatValue方法

將當前short型的數值轉換爲float類型的數值。
Short.java中的相關代碼:

	public float floatValue() {
    	// 進行類型轉換,並返回
        return (float)value;
	}

12. doubleValue方法

將當前short型的數值轉換爲double類型的數值。
Short.java中的相關代碼:

	public double doubleValue() {
    	// 進行類型轉換,並返回
        return (double)value;
	}

13. toString方法

將short型數值轉換爲String型。

1)無參數

Short.java中的相關代碼:

	public String toString() {
	    // 調用Integer的toString方法進行轉換
        return Integer.toString((int)value);
    }

2)參數爲byte

Short.java中的相關代碼:

	public static String toString(short s) {
    	// 調用Integer的toString方法,按十進制的方式進行轉換
        return Integer.toString((int)s, 10);
	}

14. hashCode方法

求short數值的哈希值。
Short.java中的相關代碼:

	@Override
	public int hashCode() {
    	return Short.hashCode(value);
	}

1)hashCode方法

Short.java中的相關代碼:

	public static int hashCode(short value) {
    	// 類型轉換並返回
        return (int)value;
    }

Short型對象的哈希值就是它本身的值。

15. equals方法

比較兩個Short對象是否相等。
Short.java中的相關代碼:

	public boolean equals(Object obj) {
    	// 若對象類型爲Byte
        if (obj instanceof Short) {
            // 比較兩者是否相等
            return value == ((Short)obj).shortValue();
        }
        // 若類型不爲Byte,返回false
        return false;
    }

16. compareTo方法

比較兩個Short對象是否相等。
若相等則返回0,若不相等則返回兩個數之差。
Short.java中的相關代碼:

	public int compareTo(Short anotherShort) {
    	// 調用compare方法
        return compare(this.value, anotherShort.value);
    }

1)compare方法。

Short.java中的相關代碼:

	public static int compare(short x, short y) {
    	// 返回兩個數之差
        return x - y;
    }

17. reverseBytes方法

將數值i在二進制表示下,按字節將位的順序反轉,即每8位一反轉。
Short.java中的相關代碼:

    public static short reverseBytes(short i) {
        return (short) (((i & 0xFF00) >> 8) | (i << 8));
	}

18. toUnsignedInt方法

將當前short型的數值轉換爲無符號int型數值。
Short.java中的相關代碼:

	public static int toUnsignedInt(short x) {
    	// 進行類型轉換,和1111111111111111B進行與運算,返回
        return ((int) x) & 0xffff;
    }

19. toUnsignedLong方法

將當前short型的數值轉換爲無符號long型數值。
Short.java中的相關代碼:

	public static long toUnsignedLong(short x) {
		// 進行類型轉換,和1111111111111111B進行與運算,返回
        return ((long) x) & 0xffffL;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章