【Java】JDK源码分析——Short

Short源码分析

  • 一.概述
  • 二.源码分析
    • 1.全局变量
    • 2.静态内部类ShortCache
    • 3.构造方法
      • 1)参数为short
      • 2)参数为String
    • 4. parseShort方法
    • 5. valueOf方法
    • 6. decode方法
    • 7. byteValue方法
    • 8. shortValue方法
    • 9. intValue方法
    • 10. longValue方法
    • 11. floatValue方法
    • 12. doubleValue方法
    • 13. toString方法
      • 1)无参数
      • 2)参数为byte
    • 14. hashCode方法
      • 1)hashCode方法
    • 15. equals方法
    • 16. compareTo方法
      • 1)compare方法。
    • 17. reverseBytes方法
    • 18. toUnsignedInt方法
    • 19. toUnsignedLong方法

一.概述

Short是short的包装类,表示两个字节以内的整型数值。
Short.java中的相关代码:

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

1.Short被final修饰,不能被继承。
2.继承了Number,可以实现数值间的转换。
3.实现了Comparable接口,可以进行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;
    }

你可能感兴趣的:(Java)