今天准备看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;
}
整理不易,喜欢可以点个赞。谢谢