前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK源码解析之 Java.lang.Byte

JDK源码解析之 Java.lang.Byte

作者头像
栗筝i
发布2022-12-01 20:06:39
4840
发布2022-12-01 20:06:39
举报
文章被收录于专栏:迁移内容迁移内容

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。它会报错的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、类定义
  • 二、成员变量
  • 三、构造器
  • 四、内部类
  • 五、普通方法
  • 六、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档