一 简介

byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数

取值范围:默认值为0,最小值为-128(-27);最大值是127(27-1)

Byte类是byte的包装类,被final修饰,不能被继承,继承了Number类,可以用于数字类型的一系列转换,还实现了Comparable接口,可以用于比较

二 Number抽象类

Java 语言为每一个内置数据类型提供了对应的包装类。

Number类是java.lang包下的一个抽象类,提供了将包装类型拆箱成基本类型的方法,所有基本类型的数据包装类型都继承了该抽象类(除了Character、Boolean),并且是final声明不可继承改变

一般情况下我们会使用数据的基本数据类型:byte、int、short、long、double、float;

对应的包装类型:Byte、Integer、Short、Long、Double、Float; 每个包装类型都实现了所有类型转换的方法

该抽象类中定义方法都由子类去具体实现:

    public abstract class Number implements java.io.Serializable {

        public abstract int intValue();

        public abstract long longValue();

        public abstract float floatValue();

        public abstract double doubleValue();

        public byte byteValue() {
return (byte)intValue();
} public short shortValue() {
return (short)intValue();
} private static final long serialVersionUID = -8742448824652078965L;
}

三 源码分析

    /**
* byte 最小值的常量 -2 ^ 7.
* Java 中用补码表示二进制数, 补码最高位表示符号位,0 表示正数,1 表示负数.
* 正数补码为其本身; 负数补码为其各位取反加1
*/
public static final byte MIN_VALUE = -128; // byte 最大值为 2 ^ 7 -1
public static final byte MAX_VALUE = 127; // Byte类型class实例
@SuppressWarnings("unchecked")
public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte"); public static String toString(byte b) {
return Integer.toString((int)b, 10);//按十进制数处理
} //静态内部类,缓存使用
private static class ByteCache {
private ByteCache(){}
//缓存数组,长度为 128(负数) + 127(正数) + 1(0)
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对象,从缓存中获取初始化好的Byte实例
@HotSpotIntrinsicCandidate
public static Byte valueOf(byte b) {
final int offset = 128;
return Byte.ByteCache.cache[(int)b + offset];
} //解析字符串返回Byte包装类实例
public static Byte valueOf(String s) throws NumberFormatException {
return valueOf(s, 10);// 调用下面方法
} //指定字符串进制数进行解析,返回包装类
public static Byte valueOf(String s, int radix)
throws NumberFormatException {
return valueOf(parseByte(s, radix));//调用下面方法
} //解析String为byte基本类型,默认是十进制数
public static byte parseByte(String s) throws NumberFormatException {
return parseByte(s, 10);//调用下面方法
} //将字符串解析为byte类型,radix是基数,radix是几,s就是几进制数,解析完结果是十进制数
public static byte parseByte(String s, int radix)
throws NumberFormatException {
int i = Integer.parseInt(s, radix);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value out of range. Value:\"" + s + "\" Radix:" + radix);
return (byte)i;
}
//可解析以0x,#或0前缀的十六进制八进制等等的数值,valueOf只支持十进制,基数默认写死10了
public static Byte decode(String nm) throws NumberFormatException {
int i = Integer.decode(nm);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value " + i + " out of range from input " + nm);
return valueOf((byte)i);
} // Byte类型的基本数值
private final byte value; //构造器: jdk9后已废弃(每次都会创建新的),推荐使用valueOf方法,(使用缓存,以节省性能)
@Deprecated(since="9")
public Byte(byte value) {
this.value = value;
}
@Deprecated(since="9")
public Byte(String s) throws NumberFormatException {
this.value = parseByte(s, 10);
} /**
* 实现Number父类的数据类型方法,直接强转
*/
public byte byteValue() {return value;}
public short shortValue() {return (short)value;}
public int intValue() {return (int)value;}
public long longValue() { return (long)value;}
public float floatValue() {return (float)value;}
public double doubleValue() {return (double)value;}
//调用Integer方法
public String toString() {
return Integer.toString((int)value);
} //hash值为 value的int值
@Override
public int hashCode() {
return Byte.hashCode(value);
} public static int hashCode(byte value) {
return (int)value;
} //equals: 只有参数是Byte,并且byte值相等为true,其他为false
public boolean equals(Object obj) {
if (obj instanceof Byte) {
return value == ((Byte)obj).byteValue();
}
return false;
} //比较大小
public int compareTo(Byte anotherByte) {
return compare(this.value, anotherByte.value);
} public static int compare(byte x, byte y) {
return x - y;
} // 直接相减 // jdk9 新增,比较无符号的两个byte 大小
public static int compareUnsigned(byte x, byte y) {
return Byte.toUnsignedInt(x) - Byte.toUnsignedInt(y);
} /**
* 0xff 表示为二进制就是 1111 1111。在byte类型中,代表-1(补码,除了符号位,其他取反再+1);但在short或者int类型中则代表255
* 当把byte类型的-1赋值到short或者int类型时(符号扩展),虽然值仍然代表-1,但却由1111 1111变成1111 1111 1111 1111.
* 再将其与0xff进行掩码:
* -1: 11111111 1111111
* 0xFF: 00000000 1111111
* 255: 00000000 1111111
* 所以这样,-1就转换成255.
*/
// jdk8新增,转换为无符号的int值需要零扩展而不是符号扩展
public static int toUnsignedInt(byte x) {
return ((int) x) & 0xff;
} // jdk8新增,转换为无符号的long值
public static long toUnsignedLong(byte x) {
return ((long) x) & 0xffL;
} // 位数, 8位
public static final int SIZE = 8; // 字节数, byte 为 1
public static final int BYTES = SIZE / Byte.SIZE; private static final long serialVersionUID = -7183698231559129828L;

JDK源码之Byte类分析的更多相关文章

  1. JDK源码之Integer类分析

    一 简介 Integer是int基本类型的包装类,同样继承了Number类,实现了Comparable接口,String类中的一些转化方法就使用了Integer类中的一些API,且fianl修饰不可继 ...

  2. JDK源码之Boolean类分析

    一 简介 boolean类型的封装类,将基本类型为boolean的值包装在一个对象中,实现序列化接口,和Comparable接口 额外提供了许多便捷方法,比较简单,直接贴代码分析 二 源码分析 //t ...

  3. JDK源码之AbstractStringBuilder类分析

    一 概述 二 实现接口 AbstractStringBuilder实现了两个接口: Appendable 概述: Appendable的实现类的对象可以附加字符序列和值. 要追加的字符应该是Unico ...

  4. JDK源码之Double类&Float类分析

    一 概述 Double 类是基本类型double的包装类,fainl修饰,在对象中包装了一个基本类型double的值.Double继承了Number抽象类,具有了转化为基本double类型的功能. 此 ...

  5. JDK源码之String类解析

    一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以 ...

  6. [Android FrameWork 6.0源码学习] LayoutInflater 类分析

    LayoutInflater是用来解析XML布局文件,然后生成对象的ViewTree的工具类.是这个工具类的存在,才能让我们写起Layout来那么省劲. 我们接下来进去刨析,看看里边的奥秘 //调用i ...

  7. jdk源码理解-String类

    String类的理解 简记录一下对于jdk的学习,做一下记录,会持续补充,不断学习,加油 1.String的hash值的计算方法. hash值的计算方法多种多样,jdk中String的计算方法如下,比 ...

  8. jdk源码阅读-Object类

    native 关键字 private static native void registerNatives(); static { registerNatives(); } public final ...

  9. 深入JDK源码之Arrays类中的排序查找算法(转)

    原文出处: 陶邦仁 binarySearch()方法 二分法查找算法,算法思想:当数据量很大适宜采用该方法.采用二分法查找时,数据需是排好序的. 基本思想:假设数据是按升序排序的,对于给定值x,从序列 ...

随机推荐

  1. windows 8.0 mysql 修改root 密码

    Mysql 忘记root密码和修改root密码的解决方法(小结) 一.以下是Windows操作系统的操作步骤: 1. 关闭正在运行的MySQL服务-->net stop mysql 2. 打开D ...

  2. Python数据分析:手把手教你用Pandas生成可视化图表

    大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂,想要搞明白并非易事.但自从Python进入3.0时代以后, ...

  3. JAVA字节码文件之常量池

    一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符 ...

  4. 基于 HTML5 WebGL 与 WebVR 3D 虚实现实的可视化培训系统

    前言 2019 年 VR, AR, XR, 5G, 工业互联网等名词频繁出现在我们的视野中,信息的分享与虚实的结合已经成为大势所趋,5G 是新一代信息通信技术升级的重要方向,工业互联网是制造业转型升级 ...

  5. 入门gulp前端构建工具

    1. 全局安装 gulp:(倘若之前电脑安装过,则跳过此步骤) $ cnpm install -g gulp 2. 作为项目的开发依赖(devDependencies)安装: (此步骤会自动在目录下创 ...

  6. 从0开发3D引擎(六):函数式反应式编程及其在引擎中的应用

    目录 上一篇博文 介绍函数式反应式编程 函数式反应式编程学习资料 函数式反应式编程的优点与缺点 优点 缺点 异步处理的其它方法 为什么使用Most库 引擎中相关的函数式反应式编程知识点 参考资料 大家 ...

  7. 2019牛客暑期多校第五场题解ABGH

    A.digits 2 传送门 题意:给你一个n,要求输出一个每一位数字之和能整除n且其本身也能整除n的数.n不超过100,要求的数不超过10000位数. 题解:直接将n输出n次. 代码: #inclu ...

  8. 日志查看工具 logviewer pro的使用

    1.logViewer Pro 介绍 logViewer Pro 是一款log文件查看器,它可以在短短数秒内打开上G的LOG文件,支持高亮某行文字(例如警告,错误),支持Unicode名字,支持查看的 ...

  9. CTPN中anchors代码

    import numpy as np def generate_basic_anchors(sizes, base_size=16): #base_anchor([0,0,15,15]) base_a ...

  10. Java 中的foreach(增强for循环)

    foreach概述 增强for循环:底层使用的是送代器,使用for循环的格式,简化了送代器的书写,foreach是JDK1.5之后出现的新特性 使用增强for循环 遍历集合 /** * 遍历集合 * ...