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。它會報錯的