JDK1.8源码解读之 Byte

312 阅读3分钟

概述

Byte类型包裹了一个基本类型byte,一个Byte对象一定包含了一个类型是byte的成员属性,这里最为惊讶的地方,是Byte竟然是继承自Number,之前对这个认识不足。

继承关系

public final class Byte extends Number implements Comparable 继承自 Number 实现了 Comparable 接口

成员属性

public static final byte MIN_VALUE = -128;

这是一个byte数据类型的最小值

public static final byte MAX_VALUE = 127;

这是一个byte数据类型的最大值

public static final Class TYPE = (Class) Class.getPrimitiveClass("byte");

返回对应的基本类型的名称,即所有的Boolean对象的基本类型都是“byte”。

private final byte value;

存储了Boolean对象的值

public static final int SIZE = 8;

一个byte默认用8位存储。

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

一个byte对象占据的字节数。默认是1。

构造器

public Byte(byte value) {
    this.value = value;
}

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

关键方法

+ valueOf()

返回对应的Byte值

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

转化为数字(按照指定的进制),然后转化为byte,如果超出byte的数据范围,抛出异常。

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;
}
public static byte parseByte(String s) { ... }// 进制默认为10进制。
+ valueOf()

按照指定的进制,转化为Byte

public static Byte valueOf(String s, int radix) throws NumberFormatException { ... }

重载方法,默认采用10进制

public static Byte valueOf(String s) throws NumberFormatException {
    return valueOf(s, 10);
}
+ decode()

解码为Byte

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);
}
+ byteValue()

将当前Byte,转化为byte值,值

public byte byteValue() {
    return value;
}

此外还有shortValue(),intValue(),longValue(),floatValue(),doubleValue()等类似方法。

+ equals()

当目标对象是一个Byte,并且和当前Byte对象的值也相等的时候,返回true,否则返回false。

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

当前Byte对象和另一个Byte对象比较,返回值是 当前Byte - 参数Byte。

public int compareTo(Byte anotherByte) {
    return compare(this.value, anotherByte.value);
}
+ compare()

两个 byte 对象比较,返回差值。

public static int compare(byte x, byte y) {
    return x - y;
}

内部类

对所有byte值进行了缓存,需要某个byte值的时候,直接从已经创建的Byte中获取。而不需要新建对象,带来系统开销。

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值。这种做法是为了避免频繁新建和销毁对象带来的额外系统开销。

希望和大家多多交流


我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。