JDK源码解读第六章:java.lang.Byte

360 阅读5分钟

Byte

1.Byte声明

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

可以看到Byte类继承了Number类,而又不是抽象类,自然要重写Number类中的xxxValue方法。另外Byte类实现了Comparable接口,Comparable是一个接口,该接口定义类的自然顺序,实现该接口的类就可以按这种方式排序,一般情况下如果某类对象自身具有比较的特性就可以实现该接口,比如这里的Byte代表的是一种数,而数本身就具有比较的特性,就可以实现该接口。

2.Byte边界值

 	public static final byte   MIN_VALUE = -128;
    public static final byte   MAX_VALUE = 127;

为什么最大值是127,最小值是-128.java中用补码表示二进制。byte为8个字节,即1位。最高位是符号位。最大值是01111111,因正数的补码是其本身,即最大值的补码是01111111,最大值的原码也是01111111,所以,此正数为01111111即用十进制表示形式为127。最小值是10000000,由于是补码需要转换成原码,因此先减去1即01111111,然后取反10000000,这就是原码,原码就是10000000,这就是最小值的绝对值,即2^7=128,那么,最小值就是-128。

3.toString(byte b)

 	public static String toString(byte b) {
        return Integer.toString((int)b, 10);
    }

它调用了Integer.toString(int i, int radix)方法,这个方法等我们看Integer类的源码时再讲解。

4.ByteCache

 	private static class ByteCache {
        private ByteCache(){}

        static final Byte cache[] = new Byte[-(-128) + 127 + 1];

        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Byte((byte)(i - 128));
        }
    }

这是Byte的一个内部类,而且是私有的,只能在本类中调用。这个内部类的作用就是在类初始化的时候就会调用,创建一个byte对象,缓存所有byte可能存在的值。

5.valueOf(byte b)

 	public static Byte valueOf(byte b) {
        final int offset = 128;
        return ByteCache.cache[(int)b + offset];
    }

这里的valueOf其实就是一个静态方法,作用是从上述缓存数组中取得对应的byte对象。因为数组下标是从0开始的不包含负数,所以这里会加上一个offset来取得数组对应位置的元素值。

6.valueOf(byte b)

 	public static byte parseByte(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 (byte)i;
    }

将一个字符串转换为byte输出,其中调用的是Integer.parseInt(s, radix)得到一个int数值,这个方法后续再说,在判断这个数值是否在边界值以内,不在就抛出异常,在就转换为byte输出。注意radix就是目标字符串的进制表示法,常用的有2进制、8进制、10进制和16进制。

7.arseByte(String s, int radix)

 	public static byte parseByte(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 (byte)i;
    }

将一个字符串转换为byte输出,其中调用的是Integer.parseInt(s, radix)得到一个int数值,这个方法后续再说,在判断这个数值是否在边界值以内,不在就抛出异常,在就转换为byte输出。注意radix就是目标字符串的进制表示法,常用的有2进制、8进制、10进制和16进制。

8.decode(String nm)

 	public static Byte 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((byte)i);
    }

将其它进制表示法,表示的字符串数据转换为10进制表示的byte数据,然后返回对应的Byte对象。其中常用的"其它"进制表示法有16进制表示法(数字前加0x或#)、8进制表示法(在数字前面加0)、2进制表示法(用0和1表示数字)。核心方法是Integer.decode(nm),这个后面再说,最后判断下转换后的数据是否在byte类型的数值范围内,然后调用valueOf(byte b)方法从缓存中获取Byte对象。

9.属性和构造方法

 	private final byte value;
    
    public Byte(byte value) {
        this.value = value;
    }
	public Byte(String s) throws NumberFormatException {
        this.value = parseByte(s, 10);
	}

字符串构造方法调用parseByte(s, 10),默认按照10进制转换得到byte数值。

10.xxvalue

 	public byte byteValue() {
    	return value;
	}
	public short shortValue() {
    	return (short)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;
	}

重写父类的抽象方法,可以看到这些方法用的都是java的强制类型转换机制,由于这些转换中byte的长度最小,所以不用考虑数据溢出的问题。

11.hashCode()

 	@Override
    public int hashCode() {
        return Byte.hashCode(value);
    }
    
    public static int hashCode(byte value) {
        return (int)value;
    }

这里是重写Object的hashCode方法,可以看到返回的就是Byte对象表示的数值。

12.equals(Object obj)

 	public boolean equals(Object obj) {
        if (obj instanceof Byte) {
            return value == ((Byte)obj).byteValue();
        }
        return false;
    }

这里是重写Object的equals方法,比较两个Byte对象是否是同一个对象,分为两步:第一步判断传入的对象是否是Byte类型,第二步判断两个对应的value值是否相等。如果这两个条件都满足那么这两个对象就是同一个对象。

13.compareTo(Byte anotherByte)

 	public int compareTo(Byte anotherByte) {
        return compare(this.value, anotherByte.value);
    }
    
    public static int compare(byte x, byte y) {
        return x - y;
    }

可以看到返回的是两个byte数据的差值,返回值大于0表示前一个数据比后一个数据大,返回值等于 0表示两个数据相等,返回值小于0表示第一个数据小于第二个数据。

14.toUnsignedInt(byte x)

 	public static int toUnsignedInt(byte x) {
        return ((int) x) & 0xff;
	}

这个方法是jdk1.8之后新加的,作用是将byte数据转换为无符号的int数据。方法的实现很简单就是将目标值和0xff这个数做&的运算。

15.toUnsignedInt(byte x)

 	public static int toUnsignedInt(byte x) {
        return ((int) x) & 0xff;
	}

这个方法同toUnsignedInt类似只不过把数据强转为long类型后进行运算。注意同一个byte类型的数据转换成int和long后所表示的二进制的数据的位数是不相同的int为32位,long是64位。

16.toUnsignedInt(byte x)

 	public static final int SIZE = 8;
    
    public static final int BYTES = SIZE / Byte.SIZE;

SIZE用来表示于二进制补码形式的byte值的位数,值为8,静态变量且不可变。
BYTES用来表示于二进制补码形式的byte值的字节数,值为1,静态变量且不可变。