【Java】JDK源码分析——Byte

一.概述

Byte是byte的包装类,表示一个字节以内的整型数值。范围为-128到127。
Byte.java中的相关代码:

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

1.Byte被final修饰,不能被继承。
2.继承了Number,可以实现数值间的转换。
3.实现了Comparable<Byte>接口,可以进行Byte类型对象之间的比较。

二.源码分析

1.全局变量

Byte.java中的相关代码:

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

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

	// 抑制没有类型检查而出现的警告
	@SuppressWarnings("unchecked")
	// Byte类中对应的原始的byte
	// Byte.class和byte.class不相等,但Byte.TYPE和byte.class相等
	public static final Class<Byte> TYPE = (Class<Byte>)Class.getPrimitiveClass("byte");

	private final byte value; // 用于保存Byte的值

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

	public static final int BYTES = SIZE / Byte.SIZE; // 表示Byte占的字节数

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

2.静态内部类ByteCache

该类用于Byte型数值的缓存,提供了一个大小为256的Byte数组,该数组索引从0到255,对应Byte表示的数值范围:-128到127。
Byte.java中的相关代码:

	private static class ByteCache {
    	// 私有化默认的构造方法,因此不能创建该类的对象实例
        private ByteCache(){}
        // 创建长度为256的Byte数组
        // 128表示128个负数,127为127个正数,1表示0
        static final Byte cache[] = new Byte[-(-128) + 127 + 1];
        // 静态初始化代码块
        static {
            // 循环填充数据
            for(int i = 0; i < cache.length; i++)
                // // 128为偏置,数组0位置数值为-128,255位置数值为127
                cache[i] = new Byte((byte)(i - 128));
        }
	}

3.构造方法

1)参数为byte

Byte.java中的相关代码:

	public Byte(byte value) {
    	// 保存数值到全局变量
        this.value = value;
	}

2)参数为String

Byte.java中的相关代码:

	public Byte(String s) throws NumberFormatException {
    	// 调用parseByte方法,作为十进制数解析成byte型数值
        this.value = parseByte(s, 10);
	}

4. parseByte方法

将带有+、-号的字符串按十进制解析成byte型数值。
Byte.java中的相关代码:

	public static byte parseByte(String s) throws NumberFormatException {
    	// 调用重载方法
        return parseByte(s, 10);
	}

调用重载的parseByte方法。
指定进制对字符串进行解析。
Byte.java中的相关代码:

    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;
	}

5. valueOf方法

将String类型的对象转换为Byte型。
Byte.java中的相关代码:

	public static Byte valueOf(String s) throws NumberFormatException {
    	// 调用重载方法,并返回
        return valueOf(s, 10);
	}

调用了重载的valueOf方法。
指定进制对String对象进行转换。
Byte.java中的相关代码:

    public static Byte valueOf(String s, int radix)
        throws NumberFormatException {
        // 调用parseByte方法进行转换
        // 转换的结果作为参数,调用重载方法,并返回
        return valueOf(parseByte(s, radix));
	}

调用了重载的valueOf方法。
Byte.java中的相关代码:

	public static Byte valueOf(byte b) {
    	// 128为偏置
        final int offset = 128;
        // 从缓存中获取
        return ByteCache.cache[(int)b + offset];
	}

6. decode方法

对字符串形式的数值进行解析。
decode方法支持的字符串形式比parseByte方法更丰富。
支持不同进制的标识符(0x、#等)和小数形式等。
Byte.java中的相关代码:

	public static Byte decode(String nm) throws NumberFormatException {
    	// 调用Integer的decode方法,解析成int型
        int i = Integer.decode(nm);
        // 判断解析出的数据是否满足byte型数值的范围要求
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                    "Value " + i + " out of range from input " + nm);
		// 现进行类型转换,再调用valueOf方法,从缓存中获取数值
        return valueOf((byte)i);
    }

7. byteValue方法

获取当前byte类型的数值
Byte.java中的相关代码:

	public byte byteValue() {
    	// 直接返回
        return value;
	}

8. shortValue方法

将当前byte型的数值转换为short类型的数值。
Byte.java中的相关代码:

	public short shortValue() {
    	// 进行类型转换,并返回
        return (short)value;
	}

9. intValue方法

将当前byte型的数值转换为int类型的数值。
Byte.java中的相关代码:

	public int intValue() {
    	// 进行类型转换,并返回
        return (int)value;
	}

10. longValue方法

将当前byte型的数值转换为long类型的数值。
Byte.java中的相关代码:

	public long longValue() {
    	// 进行类型转换,并返回
        return (long)value;
	}

11. floatValue方法

将当前byte型的数值转换为float类型的数值。
Byte.java中的相关代码:

	public float floatValue() {
    	// 进行类型转换,并返回
        return (float)value;
	}

12. doubleValue方法

将当前byte型的数值转换为double类型的数值。
Byte.java中的相关代码:

	public double doubleValue() {
    	// 进行类型转换,并返回
        return (double)value;
	}

13.toString方法

将byte型数值转换为String型。

1)无参数

Byte.java中的相关代码:

	public String toString() {
    	// 调用Integer的toString方法进行转换
        return Integer.toString((int)value);
	}

2)参数为byte

Byte.java中的相关代码:

	public static String toString(byte b) {
    	// 调用Integer的toString方法,按十进制的方式进行转换
        return Integer.toString((int)b, 10);
	}

14. hashCode方法

求byte数值的哈希值。
Byte.java中的相关代码:

    @Override
	public int hashCode() {
    	// 调用Byte的静态方法hashCode
        return Byte.hashCode(value);
	}

1)hashCode方法

Byte.java中的相关代码:

	public static int hashCode(byte value) {
    	// 类型转换并返回
        return (int)value;
	}

Byte型对象的哈希值就是它本身的值。

15. equals方法

比较两个Byte对象是否相等。
Byte.java中的相关代码:

	public boolean equals(Object obj) {
    	// 若对象类型为Byte
        if (obj instanceof Byte) {
            // 比较两者是否相等
            return value == ((Byte)obj).byteValue();
        }
        // 若类型不为Byte,返回false
        return false;
	}

16. compareTo方法

比较两个Byte对象是否相等。
若相等则返回0,若不相等则返回两个数之差。
Byte.java中的相关代码:

	public int compareTo(Byte anotherByte) {
    	// 调用compare方法
        return compare(this.value, anotherByte.value);
	}

1)compare方法。

Byte.java中的相关代码:

	public static int compare(byte x, byte y) {
    	// 返回两个数之差
        return x - y;
	}

17. toUnsignedInt方法

将当前byte型的数值转换为无符号int型数值。
Byte.java中的相关代码:

	public static int toUnsignedInt(byte x) {
    	// 进行类型转换,和11111111B进行与运算,返回
        return ((int) x) & 0xff;
	}

18. toUnsignedLong方法

将当前byte型的数值转换为无符号long型数值。
Byte.java中的相关代码:

	public static long toUnsignedLong(byte x) {
    	// 进行类型转换,和11111111B进行与运算,返回
        return ((long) x) & 0xffL;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值