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

2023-11-07

目录

类的继承结构图

类的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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDK源码系列 & JAVA语言数据类型Byte 的相关文章

随机推荐

  • start.S文件分析

    S 显示源代码和反汇编代码 arm linux objdump S u boot arm linux objdump S u boot less 34800000 是这句代码的内存地址 是在Makefile中定义的 ea000014 将该汇
  • 错误:类 xxx 是公共的, 应在名为 xxx.java 的文件中声明

    此错误是因为类名和类文件名不一致造成的 我之前遇到是因为类名书写没有遵循驼峰规则 于是改了一下类名 但是类文件名没有改 启动项目时报错
  • Android Studio 之 Gradle与Project Structure详解

    http blog sina com cn s blog 77d5a0310102vhw1 html
  • 独角访谈

    1 序言 从比特币和区块链诞生的那天起 去中心化这个词就进入了大家的视野 技术极客们也纷纷开始研究这一开创性的技术及其应用 其中包括开发去中心化的数字货币交易所 然而这种交易所目前还未被大众熟知 原因有很多 比如大家目前还不够理解区块链技术
  • 时间控件里面禁选国家节假日期和双休,将其置灰

    继上篇文章 两个日期之间计算节假日 根据项目需要 对时间的选择进行约束 只能选择工作日 还是之前笨办法取到2018年和2019年的所有节假日 在计算属性中新增方法 判断是否是节假日 返回true和false 然后在时间控件中引用就可以了 看
  • 步道乐跑怎么刷次数_大事件

    别看了 没有方法 好好跑步锻炼身体才是硬道理 校会君很认真地建议大家好好跑步道乐跑哟 理由如下 没有看错 你的目标的确是80次 准备好了吗 再擦几次眼睛也没有用 女生的里程数确确实实是增加到了1 6公里 每天可以跑两次了 不过校会君觉得你应
  • Warning: Your Nexus 7 Tablet Is Not Actually a "Tablet" (But Here's How You Make It One)

    If the Nexus 7 wasn t your first Android tablet you may have noticed something different with the user interface when co
  • 将一个项目发布到Tomcat上并进行运行

    1 下载任意版本的Tomcat 我这里是9的版本 应该是当前我认为比较好用的一个版本了 有需要的话可以到公众号自取 微信公众号搜索 是短短吖 后台回复 Tomcat 即可 2 在webapp下部署一个项目Test 名字自选 英文即可 新建项
  • Python爬虫入门3:使用google浏览器获取网站访问的http信息

    前往老猿Python博客 https blog csdn net LaoYuanPython 一 开启开发者工具 为了简单处理 本次介绍的内容是基于网站已经登录的情况下去获取网页访问的http信息 首先需要使用谷歌浏览器登录指定网站 并访问
  • 分治法时间复杂度求解:主定理、代换法和递归树

    分治策略 分解 将原问题划分成形式相同的子问题 规模可以不等 对半或2 3对1 3的划分 解决 对于子问题的解决 很明显 采用的是递归求解的方式 如果子问题足够小了 就停止递归 直接求解 合并 将子问题的解合并成原问题的解 这里引出了一个如
  • error: DIV usage mismatch between xx and output

    使用NDK编译代码的时候 常常需要导入预编译库 然而使用预编译库的时候报错了 因为库文件是android源码编译出来或者是其他NDK版本产生的 库版本存在了不兼容的情况 这里明显看出DIV 函数不兼容 home u android ndk
  • 【ESP-Matter】matter协议学习笔记--以乐鑫方案为例

    matter协议学习笔记 以乐鑫方案为例 0 写在前边的话 1 matter 协议基本概念 2 设备间的本地自动化交互 2 1 同步控制的实例 2 2 异步通知 订阅 报告 3 桥接设备 4 thread 边界路由器 5 专业名词 0 写在
  • 小目标检测 改进 拆分拼接

    小目标Trick 论文链接 https paperswithcode com paper slicing aided hyper inference and fine tuning 代码链接 https github com obss sa
  • 内网IP使用Https小记

    本文章记录使用Nginx 给内网IP地址提供Https协议功能 1 使用openssl生成自签证书 2 将证书配置在Nginx中 3 使用443端口 出现的一些问题 1 Chrome浏览器 会提示不安全 可以忽略 或者本地浏览器添加证书信任
  • cout保留两位小数

    cout保留两位小数 include
  • 简单方便的 JavaScript 逆向辅助模拟方法

    这是 进击的Coder 的第 419 篇技术分享 作者 崔庆才 来源 崔庆才丨静觅 阅读本文大概需要 3 分钟 在 JavaScript 逆向过程中 我们可能找到了一些入口 但是深入追踪下去 就发现这个过程过于复杂 调用层级越来越深 最终很
  • Obsidian 编译第三方插件

    起因 obsidian spaced repetition 是Obsidian 间隔重复插件 它可以帮助你定期复习自建的知识卡片 但功能上不是很全面 碰巧看到 Felix Luo 维护的obsidian spaced repetition插
  • 一分钟教你看懂蓝屏代码,轻松解决电脑蓝屏问题

    微软为了我们电脑中的资料安全可以说煞费苦心设计了很多有效的防护机制 其中蓝屏就是一个很好的给保护机制 接下来小编就提供一些经常出现的电脑蓝屏代码给大家 电脑蓝屏问题可以说只要使用过电脑朋友都遇到过 导致电脑蓝屏的原因有很多种 所有蓝屏代码也
  • 基于SM2密码算法的环签名方案的研究与设计

    摘要 环签名算法种类很多 大多数算法设计基于双线性对或大素数难分解 在安全性和运算速度方面有待提高 与基于椭圆曲线离散对数相比 双线性对的优势并不明显 因为它无法运用一样长度的密钥提供同样的安全性能 为了能够提升方案的安全性以及能够保证签名
  • JDK源码系列 & JAVA语言数据类型Byte

    目录 类的继承结构图 类的Diagram图 类 类的注释 源码分析 全局变量 静态内部类 构造方法 静态方法 parseByte 静态方法 valueOf 静态方法 toString 静态方法 hashCode 静态方法 decode 静态