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