byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数
取值范围:默认值为0,最小值为-128(-27);最大值是127(27-1)
Byte类是byte的包装类,被final修饰,不能被继承,继承了Number类,可以用于数字类型的一系列转换,还实现了Comparable接口,可以用于比较
一、类定义
public final class Byte extends Number implements Comparable<Byte> {}
- 类被声明为final的,表示不能被继承;
- 继承了Number抽象类,可以用于数字类型的一系列转换;
- 实现了Comparable接口,强行对实现它的每个类的对象进行整体排序
二、成员变量
// byte的最小值,也就是-2的7次方public static final byte MIN_VALUE = -128;//byte的最大值,也即2的7次方减1public 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值,定义为finalprivate 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;
三、构造器
public Byte(byte value) {this.value = value;}//参数为字符串形式传入的value必须是byte类型的值,字符串s必须是可以转换为数字的字符串,不然会报错public Byte(String s) throws NumberFormatException {this.value = parseByte(s, 10);}
四、内部类
含有静态模块,class加载的时候,执行静态模块,初始化cache[]。
// Byte对象的缓存类private static class ByteCache {private ByteCache(){}// 缓存数组static final Byte cache[] = new Byte[-(-128) + 127 + 1];// 缓存初始化,范围是-128到127static {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)
public boolean equals(Object obj) {if (obj instanceof Byte) {return value == ((Byte)obj).byteValue();}return false;}
2、hashCode
重写Object中的hashCode,byte的hashCode就是它的值
@Overridepublic int hashCode() {return Byte.hashCode(value);}public static int hashCode(byte value) {return (int)value;}
3、toString(byte b)
底层调用Integer.toString,将byte强转为int值在传入一个默认的基数10。
public static String toString(byte b) {return Integer.toString((int)b, 10);}
4、toString( )
先把byte升级为int,然后用Integer的toString静态方法
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对象。
//指定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对象
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
public int compareTo(Byte anotherByte) {return compare(this.value, anotherByte.value);}public static int compare(byte x, byte y) {return x - y;}
8、转换方法
/*** 将指定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
byte a=0;String result=Integer.toString(a);
- 使用泛型时
List<Integer> nums;
这里<>需要的类。如果你用int。它会报错的