Java 源碼分析-Byte類分析

位置:java.lang

Byte是原生類型byte的包裝類,每個Byte類的對象只包含一個原生類型的字段。Byte類的定義如下:

<code>public final class Byte extends Number implements Comparable<byte> /<byte>/<code>

Byte繼承了Number,Number類的方法是各種原生類型如byte、double、float、int、long、short之間的轉換的抽象方法。當Byte實現了intValue()方法,將必選將必須將Byte類中原生類型byte轉換為int原生類型。Number類的抽象方法:

<code>//轉為int原生類型
public abstract int intValue();
//轉為long類型
public abstract long longValue();
//轉為float類型
public abstract float floatValue();
//轉為double類型
public abstract double doubleValue();
//轉為byte類型
public byte byteValue() {
return (byte)intValue();
}
//轉為short類型
public short shortValue() {
return (short)intValue();
}/<code>

Byte被final修飾符修飾,是不可變的類,當final修飾類,類不可變且不能被繼承;當final修飾方法,方法不能被子類重寫;當final修飾屬性,屬性不能改變。Byte有如下屬性:

<code>//最小值
public static final byte MIN_VALUE = -128;
//最大值
public static final byte MAX_VALUE = 127;
//class類型
public static final Class<byte> TYPE = (Class<byte>) Class.getPrimitiveClass("byte");
//當Byte被表示為二進制時的位數數量

public static final int SIZE = 8;
//表示為二進制時的字節數
public static final int BYTES = SIZE / Byte.SIZE;
//保存原生類型的值
private final byte value;/<byte>/<byte>/<code>

MIN_VALUE、MAX_VALUE、TYPE、SIZE、BYTES屬性同時被static和final關鍵字修飾,都是不可變的靜態類屬性。value屬性只有final修飾,是不可改變的屬性,保存Byte類的原生類型的值。MIN_VALUE是Byte的原生類型的最小值,MAX_VALUE是Byte的原生類型的最大值。TYPE是Byte類的class類型。SIZE和BYTES是當Byte類的原生類型的值表示為二進制時的位數數量和字節數。SIZE大小為8,表示Byte類的原生類型value表示為二進制數時,位數大小為8,字節為1。

ByteCache是Byte類的內部靜態類,定義如下:

<code>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));
}
}/<code>

ByteCache類的主要作用是為Byte類緩存範圍為-128到127之間的數,這些數存在Byte類型cache數組中,cache數組大小為256,ByteCache類中使用static模塊為Byte類型的cache數組賦值。利用cache數組緩存這些數值,為了減少創建Byte的性能消耗,提高效率。

Byte類沒有無參構造器,只有有參構造器,參數分別為byte和String類型,可以將byte和String類型的參數賦值給Byte類的屬性value,構造器如下:

<code>public Byte(byte value) {
this.value = value;
}
public Byte(String s) throws NumberFormatException {
this.value = parseByte(s, 10);
}/<code>

除了繼承父類的方法外,Byte類的方法大多是靜態方法,如下兩個比較重要的靜態方法:

<code>//將byte類型的值包裝成Byte類型
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
//將字符串轉為byte類型
public static byte parseByte(String s, int radix)
throws NumberFormatException {
int i = Integer.parseInt(s, radix);
//範圍判斷,byte類型的值在-128到127之間
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value out of range. Value:\"" + s + "\" Radix:" + radix);
//將int強轉為byte
return (byte)i;
}/<code>

這兩個靜態方法是比較重要的,Byte類的其他的靜態方法大部分都是在這兩個方法上進行封裝的。valueOf方法是將byte類型的值包裝為Byte,直接在ByteCache的緩存數組cache中獲取,所以在開發過程中可以直接用Byte類的靜態方法valueOf將byte類型包裝為Byte,避免創建Byte的性能消耗。parseByte方法是將字符串轉為byte類型,第一參數是String,第二參數是int類型的radix,表示將字符串要轉為radix進制的byte類型,parseByte方法直接用Integer.parseInt方法先將字符串轉為int類型的值,然後將int類型的值強轉為byte。

除了靜態方法外,Byte類還繼承了Number類的方法,將Byte類的原生類型byte轉為其他的基礎類型,如下:

<code>//返回Byte的原生類型byte
public byte byteValue() {
return value;
}

//將Byte類的原生類型byte強轉為short返回
public short shortValue() {
return (short)value;
}
//將Byte類的原生類型byte強轉為int返回
public int intValue() {
return (int)value;
}

//將Byte類的原生類型byte強轉為int返回
public long longValue() {
return (long)value;
}

//將Byte類的原生類型byte強轉為float返回
public float floatValue() {
return (float)value;
}
//將Byte類的原生類型byte強轉為double返回
public double doubleValue() {
return (double)value;
}/<code>

最後來看看hashCode方法和equals方法:

<code>public boolean equals(Object obj) {
if (obj instanceof Byte) {
return value == ((Byte)obj).byteValue();
}
return false;
}


public static int hashCode(byte value) {
return (int)value;
}/<code>

equals方法首先判斷傳入的參數類型是否是Byte類型,如果是,就比較Byte類的原生類型value值與傳入參數的value值是否相等,否則直接返回false。也就是不管創建多少Byte類的對象,只要他們的原生類型value值相等,那麼這些對象就是相等的。hashCode方法是直接返回Byte類型的原生類型value值,Byte類的value的範圍為-128到127,所以只會返回值範圍內的數,也最多隻能只有256個不同的Byte類的對象。

Byte類的源碼分析到此,沒有什麼難點,其他的方法有興趣的可以自行閱讀源代碼,Byte類最重要的就是用一個靜態內部類ByteCache緩存Byte所有不同的對象,在使用的時候直接通過數組獲取。


分享到:


相關文章: