jdk源码阅读之数据类型Short

今天准备看Short的源码,先贴下源代码,然后我会在源代码中根据注释和一些实现去讲解一些作用。

Short 源码

/**
 *  Short 类在对象中包装基本类型 short 的值。一个 Short 类型
    的对象只包含一个 short 类型的字段。 另外,该类提供了多个方法,可以将 short 转换
为 String,将 String 转换为 short,同时还提供了其他一些处理 short 时有用的常量和方法。

继承了Number,也是Object以及Serializable类的子类,能够使用Number类的shortValue方法,实现了Comparable,并重写了compareTo进行排序
 */
public final class Short extends Number implements Comparable<Short> {

    /**
      描述了Short可以去的最小值的常量,因为short是两位字节,一个字节8位,所以最小值为-2^15,一位为符号位
     */
    public static final short   MIN_VALUE = -32768;

    /**
  描述了Short可以去的最大值的常量,最大值为2^15,一位为符号位.
     */
    public static final short   MAX_VALUE = 32767;

    /**
     获取Short的Class类,这里对外开放的,让其他api可以通过Short的类对象去获取某些数值。
     */
    @SuppressWarnings("unchecked")
    public static final Class<Short>    TYPE = (Class<Short>) Class.getPrimitiveClass("short");

    /**
    获得的是10进制数的整型
     */
    public static String toString(short s) {
        return Integer.toString((int)s, 10);
    }

    /**
    parseShort将字符串转换为Short类型,调用Integer类型的parseInt,数据异常抛出数据格式错误。
     */
    public static short parseShort(String s, int radix)
        throws NumberFormatException {
        int i = Integer.parseInt(s, radix);
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                "Value out of range. Value:\"" + s + "\" Radix:" + radix);
        return (short)i;
    }

    /**
   将short的值转化成指定的radix进制,并返回。
     */
    public static Short valueOf(String s, int radix)
        throws NumberFormatException {
        return valueOf(parseShort(s, radix));
    }

    /**
      
     */
    public static Short valueOf(String s) throws NumberFormatException {
        return valueOf(s, 10);
    }
/**
 *  这个主要是实现short缓存,将他写成一个私有静态内部类,只有调用时才会执行。通过这个来实现单例模式,在后面调用ValueOf的时候,不会新建一个short的进行赋值,而是直接取缓存里面的值取返回,因为在第一次调用的时候初始化了。
 */
    private static class ShortCache {
        private ShortCache(){}
//写成这样是为了表示范围为  -128~127  ,所以定义的值为256
        static final Short cache[] = new Short[-(-128) + 127 + 1];

        static {
          //一共执行遍历256次
            for(int i = 0; i < cache.length; i++)
              //在赋值的时候是从-128位开始赋值的,到数组索引为128。
                cache[i] = new Short((short)(i - 128));
        }
    }

    /**
    
    返回表示指定 short 值的 Short 实例,这里要结合上面的ShortCache去理解,short的值的范围如果在-128位到127时,去取缓存内的值。
如果不需要新的{@code Short}实例,通常应优先使用此方法*而不是构造函数* {@link #Short(short)},因为此方法可能会产生明显更好的空间和时间通过缓存*频繁请求的值来提高性能。 * *此方法将始终缓存-128到127(*)范围内的值,并可以缓存此范围之外的其他值。
     */
    public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

    /**
  将 String 解码为 Short。对(可选)负号和/或基数说明符(“0x”、“0X”、“#” 或前导零)后面的字符序列进行解析就如同用 Short.parseByte 方法来解析指定的基数(10、16 或 8)一样。该字符序列必须表示为一个正值,否则将抛出NumberFormatException如果指定 `String` 的第一个字符是减号,则结果无效。`String` 中不允许出现空白字符。
     */
    public static Short decode(String nm) throws NumberFormatException {
        int i = Integer.decode(nm);
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                    "Value " + i + " out of range from input " + nm);
        return valueOf((short)i);
    }

    /**
     * 该short的值
     */
    private final short value;

   /** 
  *  构造方法
  */
    public Short(short value) {
        this.value = value;
    }
    public Short(String s) throws NumberFormatException {
        this.value = parseShort(s, 10);
    }

    /**
     强制转化成指定的类型
     */
    public byte byteValue() {
        return (byte)value;
    }
    public short shortValue() {
        return value;
    }
    public int intValue() {
        return (int)value;
    }
    public long longValue() {
        return (long)value;
    }
    public float floatValue() {
        return (float)value;
    }
    public double doubleValue() {
        return (double)value;
    }

    /**
     进行排序的重写
     */
    public int compareTo(Short anotherShort) {
        return compare(this.value, anotherShort.value);
    }
    public static int compare(short x, short y) {
        return x - y;
    }

    /**
    Byte的字节长度
     */
    public static final int SIZE = 16;

 
    /**
    转为字节数
     */
    public static short reverseBytes(short i) {
        return (short) (((i & 0xFF00) >> 8) | (i << 8));
    }


    /**
     无符号的转化,进行位运算
     */
    public static int toUnsignedInt(short x) {
        return ((int) x) & 0xffff;
    }
    public static long toUnsignedLong(short x) {
        return ((long) x) & 0xffffL;
    }

整理不易,喜欢可以点个赞。谢谢

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容