JDK源码解析之 Java.lang.Byte

2022-12-01 20:06:39 浏览数 (1)

byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数 取值范围:默认值为0,最小值为-128(-27);最大值是127(27-1) Byte类是byte的包装类,被final修饰,不能被继承,继承了Number类,可以用于数字类型的一系列转换,还实现了Comparable接口,可以用于比较

一、类定义

代码语言:javascript复制
public final class Byte extends Number implements Comparable<Byte> {}
  • 类被声明为final的,表示不能被继承;
  • 继承了Number抽象类,可以用于数字类型的一系列转换;
  • 实现了Comparable接口,强行对实现它的每个类的对象进行整体排序

二、成员变量

代码语言:javascript复制
		// byte的最小值,也就是-2的7次方
    public static final byte   MIN_VALUE = -128;
		//byte的最大值,也即2的7次方减1
    public static final byte   MAX_VALUE = 127;
		/**
     * @SuppressWarnings("unchecked")表示对警告保持静默 
     * 获取Byte的原始class对象
     */
    @SuppressWarnings("unchecked")
    public static final Class<Byte>     TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");

		//Byte对象中具体的byte值,定义为final
    private final byte value;  
		// 用于表示二进制补码二进制形式的字节值的位数(定义了Byte的大小,为8个位,即一个字节)    
    public static final int SIZE = 8;
		//用于表示二进制补码二进制形式的字节值的字节数(给出了字节,即SIZE/Byte.SIZE = 1;占一个字节)
    public static final int BYTES = SIZE / Byte.SIZE;
    // 序列化
    private static final long serialVersionUID = -7183698231559129828L;

三、构造器

代码语言:javascript复制
    public Byte(byte value) {
        this.value = value;
    }

    //参数为字符串形式传入的value必须是byte类型的值,字符串s必须是可以转换为数字的字符串,不然会报错
 
    public Byte(String s) throws NumberFormatException {
        this.value = parseByte(s, 10);
    }

四、内部类

含有静态模块,class加载的时候,执行静态模块,初始化cache[]。

代码语言:javascript复制
    // Byte对象的缓存类
    private static class ByteCache {
        private ByteCache(){}
        // 缓存数组
        static final Byte cache[] = new Byte[-(-128)   127   1];
        // 缓存初始化,范围是-128到127
        static {
            for(int i = 0; i < cache.length; i  )
                cache[i] = new Byte((byte)(i - 128));
        }
    }

定义了一个Byte的缓存值,将-128~127写入到一个cache数组,当在这个区间的时候,JVM会直接使用缓存值,但是当超过这个区间的话,会发生溢出的现象,128会变为-128,会从最小值继续循环计算

五、普通方法

1、equals (Object obj)
代码语言:javascript复制
    public boolean equals(Object obj) {
        if (obj instanceof Byte) {
            return value == ((Byte)obj).byteValue();
        }
        return false;
    }
2、hashCode

重写Object中的hashCode,byte的hashCode就是它的值

代码语言:javascript复制
    @Override
    public int hashCode() {
        return Byte.hashCode(value);
    }

    public static int hashCode(byte value) {
        return (int)value;
    }
3、toString(byte b)

底层调用Integer.toString,将byte强转为int值在传入一个默认的基数10。

代码语言:javascript复制
   public static String toString(byte b) {
        return Integer.toString((int)b, 10);
    }
4、toString( )

先把byte升级为int,然后用Integer的toString静态方法

代码语言:javascript复制
  public String toString() {
        return Integer.toString((int)value);
    }
5、 valueOf()

观察这几个方法,public static Byte valueOf(byte b)和public static byte parseByte(String s, int radix)是核心。第2个方法转换为byte;第一个方法转换为Byte,Byte根据byte的值,从缓存中获取Byte对象。

代码语言:javascript复制
    //指定byte值,返回Byte表示的实例 。
    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 {
        return valueOf(parseByte(s, radix));
    }
    
    //使用s构造一个新的Byte对象,s为byte范围内的整数。
    public static Byte valueOf(String s) throws NumberFormatException {
        return valueOf(s, 10);
    }
6、decode()

将2进制或者是8进制或者是16进制的字符串转成封装成Byte对象

代码语言:javascript复制
    public static Byte decode(String nm) throws NumberFormatException {
        // 调用Integer.decode()进行处理
        int i = Integer.decode(nm);
        if (i < MIN_VALUE || i > MAX_VALUE)
            throw new NumberFormatException(
                    "Value "   i   " out of range from input "   nm);
        // 将处理结果的值进行强转调用valueOf(byte b);
        return valueOf((byte)i);
    }
7、 compareTo与compare

compareTo 比较当前对象与指定Byte,实际调用的是compare(byte x, byte y) 比较两个byte

代码语言:javascript复制
    public int compareTo(Byte anotherByte) {
        return compare(this.value, anotherByte.value);
    }

    public static int compare(byte x, byte y) {
        return x - y;
    }
8、转换方法
代码语言:javascript复制
    /**
     * 将指定byte转换为无符号int
     */
    public static int toUnsignedInt(byte x) {
        return ((int) x) & 0xff;
    }

    /**
     * 将指定byte专为无符号long
     */
    public static long toUnsignedLong(byte x) {
        return ((long) x) & 0xffL;
    }

六、总结

Byte是java.lang中的一个类,目的是为基本数据类型byte进行封装

Byte是byte的包装类,就如同Integer和int的关系,

一般情况包装类用于泛型或提供静态方法,用于基本类型或字符串之间转换,建议尽量不要用包装类和基本类型之间运算,因为这样运算效率会很差的

6.1、类封装的好处
  • Byte可以将对象的引用传递,使得多个function共同操作一个byte类型的数据,而byte基本数据类型是赋值之后要在stack(栈区域)进行存储的;
  • 在java中包装类,比较多的用途是用在于各种数据类型的转化中。 比如,现在byte要转为String
代码语言:javascript复制
	byte a=0;
	String result=Integer.toString(a);
  • 使用泛型时

List<Integer> nums;

​ 这里<>需要的类。如果你用int。它会报错的

0 人点赞