JDK源码系列 & JAVA语言数据类型Byte

目录

类的继承结构图

类的Diagram图

类 & 类的注释

源码分析

全局变量

静态内部类

构造方法

静态方法 —— parseByte()

静态方法 —— valueOf()

静态方法 —— toString()

静态方法 —— hashCode()

静态方法 —— decode()

静态方法 —— toUnsignedInt()

静态方法 —— toUnsignedLong()

静态方法 —— compare()

普通方法 —— equals()

普通方法 —— compareTo()

类型转换方法 —— xxxValue()

下期博文 JDK源码系列 & JAVA语言数据类型Short


类的继承结构图

主要看继承

  • 可以看到Byte类继承自Number类。从英文看,知道代表了数字的意思,所以猜测Byte在Java中也是数字的一种展现形式,也可以和其它数字类型进行转换。

类的Diagram图

看继承和实现

  • Comparable接口:说明支持Byte类型对象直接的比较。
  • Serializable接口:说明支持序列化和反序列化。

类 & 类的注释

  • Byte被final修饰,意味着不能被继承。

源码分析

全局变量

    //序列化id
    private static final long serialVersionUID = -7183698231559129828L;

    //能表达的最小值
    public static final byte   MIN_VALUE = -128;

    //能表达的最大值
    public static final byte   MAX_VALUE = 127;

    //Byte对应的初始类型是byte
    //Byte.class和byte.class不相等,但Byte.TYPE和byte.class相等
    @SuppressWarnings("unchecked")
    public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");

    //一个字节二进制表示的位数
    public static final int SIZE = 8;

    //Byte占用的字节数 1B = 8b
    public static final int BYTES = SIZE / Byte.SIZE;

    //保存Byte的数据
    private final byte value;
  • Byte是byte的包装类,表示一个字节以内的整型数值。范围为-128到127

    • 也就是1Byte = 8b

静态内部类

    private static class ByteCache {
        //私有构造器,不能被实例化
        private ByteCache(){}

        //创建长度为256的Byte数组
        static final Byte cache[] = new Byte[-(-128) + 127 + 1];

        static {
            for(int i = 0; i < cache.length; i++)
                //数组0位置数值为-128,255位置数值为127
                cache[i] = new Byte((byte)(i - 128));
        }
    }    
  • 该类用于Byte型数值的缓存,提供了一个大小为256的Byte数组,该数组索引从0到255,对应Byte表示的数值范围:-128到127

构造方法

    /**
     * 构造一个新的字节对象
     */
    public Byte(byte value) {
        this.value = value;
    }

    /**
     * 通过传入字符串参数构造一个新的字节对象
     *
     */
    public Byte(String s) throws NumberFormatException {
        //参数字符串作为十进制解析成byte数组 parseByte()方法后续进行讲解
        this.value = parseByte(s, 10);
    }

静态方法 —— parseByte()

    /**
     * 将带有+、-号的字符串按十进制解析成byte型数值
     */
    public static byte parseByte(String s) throws NumberFormatException {
        //调用重载方法
        return parseByte(s, 10);
    }
    
    /**
     * 第一个参数为字符串、第二个参数为指定的进制
     * 将第一个参数字符串按指定的进制进行转化为Byte字节
     *
     * 第一个参数必须是数字 抛出异常。
     * 如果参数字符串为null或者长度为0 抛出异常。
     * 第二个参数 radix < 2 || radix > 36 抛出异常。
     */
    public static byte parseByte(String s, int radix)
        throws NumberFormatException {
        //调用Integer的parseInt方法,解析成int型
        int i = Integer.parseInt(s, radix);
        //判断解析出的数值,是否满足byte型数值的范围
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                "Value out of range. Value:\"" + s + "\" Radix:" + radix);
        //若满足,则进行类型转换,并返回
        return (byte)i;
    }

静态方法 —— valueOf()

    /**
     * 返回一个Byte包装类
     * 如果不需要每次都创建一个新的Byte实例,那么可以考虑使用valueOf方法而不是构造方法
     * 利用缓存,这个方法会有更好的性能和空间
     */
    public static Byte valueOf(byte b) {
        final int offset = 128;
        return ByteCache.cache[(int)b + offset];
    }

    /**
     * 指定进制对String对象进行转换。
     */
    public static Byte valueOf(String s, int radix)
        throws NumberFormatException {
        //调用parseByte进行转化为byte类型,然后调用重载方法
        return valueOf(parseByte(s, radix));
    }

    /**
     * 将String类型的对象转换为Byte型。
     */
    public static Byte valueOf(String s) throws NumberFormatException {
        //调用重载方法
        return valueOf(s, 10);
    }

静态方法 —— toString()

    /**
     * 将Byte按十进制返回为字符串对象
     */
    public static String toString(byte b) {
        //调用Integer的toString方法
        return Integer.toString((int)b, 10);
    }

    /**
     * 将Byte的value数值进行字符串转换
     */
    @Override
    public String toString() {
        return Integer.toString((int)value);
    }

静态方法 —— hashCode()

    /**
     * 调用重载方法
     */
    @Override
    public int hashCode() {
        return Byte.hashCode(value);
    }

    /**
     * Byte型对象的哈希值就是它本身的值
     */
    public static int hashCode(byte value) {
        return (int)value;
    }

静态方法 —— decode()

    /**
     * 解码字符串为字节
     */
    public static Byte decode(String nm) throws NumberFormatException {
        //调用Integer的decode方法,解析成int
        int i = Integer.decode(nm);
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                    "Value " + i + " out of range from input " + nm);
        //现进行类型转换,再调用valueOf方法,从缓存中获取数值
        return valueOf((byte)i);
    }

静态方法 —— toUnsignedInt()

    /**
     * 将当前byte型的数值转换为无符号int型数值.
     */
    public static int toUnsignedInt(byte x) {
        //进行类型转换
        //oxff为16进制 转为 2进制为 11111111
        //走 & 运算
        return ((int) x) & 0xff;
    }

静态方法 —— toUnsignedLong()

    /**
     * 将当前byte型的数值转换为无符号long型数值
     */
    public static long toUnsignedLong(byte x) {
        return ((long) x) & 0xffL;
    }

静态方法 —— compare()

    /**
     * 比较两个byte的大小
     * 与此方法返回一致  Byte.valueOf(x).compareTo(Byte.valueOf(y))
     *
     * x == y 返回 0  的数
     * x < y  返回 <0 的差值
     * x > y  返回 >0 的差值
     */
    public static int compare(byte x, byte y) {
        return x - y;
    }

普通方法 —— equals()

    /**
     * 比较两个对象是否相等
     */
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Byte) {
            //如果是Byte的对象,进行比较里面的数据
            return value == ((Byte)obj).byteValue();
        }
        //否则返回false
        return false;
    }

普通方法 —— compareTo()

    /**
     * 比较两个Byte对象是否相等.
     * 若相等则返回0,若不相等则返回两个数之差。
     */
    @Override
    public int compareTo(Byte anotherByte) {
        //调用重载方法
        return compare(this.value, anotherByte.value);
    }

类型转换方法 —— xxxValue()

/**
     * 获取当前byte类型的数值
     */
    @Override
    public byte byteValue() {
        return value;
    }

    /**
     * 将当前byte型的数值转换为short类型的数值。
     */
    @Override
    public short shortValue() {
        return (short)value;
    }

    /**
     * 将当前byte型的数值转换为int类型的数值。
     */
    @Override
    public int intValue() {
        return (int)value;
    }

    /**
     * 将当前byte型的数值转换为long类型的数值。
     */
    @Override
    public long longValue() {
        return (long)value;
    }

    /**
     * 将当前byte型的数值转换为float类型的数值。
     */
    @Override
    public float floatValue() {
        return (float)value;
    }

    /**
     * 将当前byte型的数值转换为double类型的数值。
     */
    @Override
    public double doubleValue() {
        return (double)value;
    }

下期博文 JDK源码系列 & JAVA语言数据类型Short

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ke555

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值