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