Byte
1.Byte声明
public final class Byte extends Number implements Comparable<Byte> {}
可以看到Byte类继承了Number类,而又不是抽象类,自然要重写Number类中的xxxValue方法。另外Byte类实现了Comparable接口,Comparable是一个接口,该接口定义类的自然顺序,实现该接口的类就可以按这种方式排序,一般情况下如果某类对象自身具有比较的特性就可以实现该接口,比如这里的Byte代表的是一种数,而数本身就具有比较的特性,就可以实现该接口。
2.Byte边界值
public static final byte MIN_VALUE = -128;
public static final byte MAX_VALUE = 127;
为什么最大值是127,最小值是-128.java中用补码表示二进制。byte为8个字节,即1位。最高位是符号位。最大值是01111111,因正数的补码是其本身,即最大值的补码是01111111,最大值的原码也是01111111,所以,此正数为01111111即用十进制表示形式为127。最小值是10000000,由于是补码需要转换成原码,因此先减去1即01111111,然后取反10000000,这就是原码,原码就是10000000,这就是最小值的绝对值,即2^7=128,那么,最小值就是-128。
3.toString(byte b)
public static String toString(byte b) {
return Integer.toString((int)b, 10);
}
它调用了Integer.toString(int i, int radix)方法,这个方法等我们看Integer类的源码时再讲解。
4.ByteCache
private static class ByteCache {
private ByteCache(){}
static final Byte cache[] = new Byte[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Byte((byte)(i - 128));
}
}
这是Byte的一个内部类,而且是私有的,只能在本类中调用。这个内部类的作用就是在类初始化的时候就会调用,创建一个byte对象,缓存所有byte可能存在的值。
5.valueOf(byte b)
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
这里的valueOf其实就是一个静态方法,作用是从上述缓存数组中取得对应的byte对象。因为数组下标是从0开始的不包含负数,所以这里会加上一个offset来取得数组对应位置的元素值。
6.valueOf(byte b)
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;
}
将一个字符串转换为byte输出,其中调用的是Integer.parseInt(s, radix)得到一个int数值,这个方法后续再说,在判断这个数值是否在边界值以内,不在就抛出异常,在就转换为byte输出。注意radix就是目标字符串的进制表示法,常用的有2进制、8进制、10进制和16进制。
7.arseByte(String s, int radix)
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;
}
将一个字符串转换为byte输出,其中调用的是Integer.parseInt(s, radix)得到一个int数值,这个方法后续再说,在判断这个数值是否在边界值以内,不在就抛出异常,在就转换为byte输出。注意radix就是目标字符串的进制表示法,常用的有2进制、8进制、10进制和16进制。
8.decode(String nm)
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);
}
将其它进制表示法,表示的字符串数据转换为10进制表示的byte数据,然后返回对应的Byte对象。其中常用的"其它"进制表示法有16进制表示法(数字前加0x或#)、8进制表示法(在数字前面加0)、2进制表示法(用0和1表示数字)。核心方法是Integer.decode(nm),这个后面再说,最后判断下转换后的数据是否在byte类型的数值范围内,然后调用valueOf(byte b)方法从缓存中获取Byte对象。
9.属性和构造方法
private final byte value;
public Byte(byte value) {
this.value = value;
}
public Byte(String s) throws NumberFormatException {
this.value = parseByte(s, 10);
}
字符串构造方法调用parseByte(s, 10),默认按照10进制转换得到byte数值。
10.xxvalue
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;
}
重写父类的抽象方法,可以看到这些方法用的都是java的强制类型转换机制,由于这些转换中byte的长度最小,所以不用考虑数据溢出的问题。
11.hashCode()
@Override
public int hashCode() {
return Byte.hashCode(value);
}
public static int hashCode(byte value) {
return (int)value;
}
这里是重写Object的hashCode方法,可以看到返回的就是Byte对象表示的数值。
12.equals(Object obj)
public boolean equals(Object obj) {
if (obj instanceof Byte) {
return value == ((Byte)obj).byteValue();
}
return false;
}
这里是重写Object的equals方法,比较两个Byte对象是否是同一个对象,分为两步:第一步判断传入的对象是否是Byte类型,第二步判断两个对应的value值是否相等。如果这两个条件都满足那么这两个对象就是同一个对象。
13.compareTo(Byte anotherByte)
public int compareTo(Byte anotherByte) {
return compare(this.value, anotherByte.value);
}
public static int compare(byte x, byte y) {
return x - y;
}
可以看到返回的是两个byte数据的差值,返回值大于0表示前一个数据比后一个数据大,返回值等于 0表示两个数据相等,返回值小于0表示第一个数据小于第二个数据。
14.toUnsignedInt(byte x)
public static int toUnsignedInt(byte x) {
return ((int) x) & 0xff;
}
这个方法是jdk1.8之后新加的,作用是将byte数据转换为无符号的int数据。方法的实现很简单就是将目标值和0xff这个数做&的运算。
15.toUnsignedInt(byte x)
public static int toUnsignedInt(byte x) {
return ((int) x) & 0xff;
}
这个方法同toUnsignedInt类似只不过把数据强转为long类型后进行运算。注意同一个byte类型的数据转换成int和long后所表示的二进制的数据的位数是不相同的int为32位,long是64位。
16.toUnsignedInt(byte x)
public static final int SIZE = 8;
public static final int BYTES = SIZE / Byte.SIZE;
SIZE用来表示于二进制补码形式的byte值的位数,值为8,静态变量且不可变。
BYTES用来表示于二进制补码形式的byte值的字节数,值为1,静态变量且不可变。