一.類繼承java
Boolean的源碼類定義部分以下:ide
1 public final class Boolean implements java.io.Serializable, 2 Comparable<Boolean>
在IDEA生成其類繼承圖:學習
根據以上信息能夠得知:this
1.Boolean類實現了java.io.Serializable接口,衆所周知,這是實現對象序列化的功能。spa
2.Boolean類實現了Comparable<Boolean>接口。3d
那麼問題來了?code
這個Comparable<Boolean>接口是什麼東西呢?對象
看起來是否很眼熟,是否曾在瀚海代碼量裏偶然一瞥過?blog
若你在字符串裏用過str.compareTo(str2)來作過比較排序話,那你必定多少有點印象,其實Java中的全部compareTo方法都來源於一個共同的祖先,即Comparable接口。排序
Boolean類一樣繼承是這個Comparable接口,它的源代碼很簡單,就只定義了一個方法:
1 public interface Comparable<T> { 2 public int compareTo(T o); 3 }
繼承該接口的類,均可經過compareTo方法來對類對象進行排序。該方法將對象與指定對象的順序作比較,若對象大於、等於或小於指定對象,將分別返回1,0,-1,
推而論之,你也能夠由此而明白str.compareTo(str2)底層的繼承原理了。
二.類結構
Boolean源碼定義瞭如下的字段與方法,下面將逐一學習分析:
Boolean類包含如下屬性:
1 public static final Boolean TRUE = new Boolean(true); 2 3 public static final Boolean FALSE = new Boolean(false); 4 5 6 @SuppressWarnings("unchecked") 7 public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean"); 8 9 10 private final boolean value; 11 12 //用於Java序列化機制,在序列化與反序列過程當中,用於判斷反序列化文件與該類是否同一版本,若同可反序列化成功。 13 private static final long serialVersionUID = -3665804199014368530L;
說明:
1.TRUE與FALSE是Boolean提供的兩個靜態常量,在用到true或者false時,可直接用這兩個常量,無需再耗費資源來建立相似new Boolean(true)這樣的新實例;
2.TYPE 基本類型 boolean 的 Class 對象,可用於類反射;
3.value是一個final 定義的私有變量,即
1 public Boolean(boolean value) { 2 this.value = value; 3 }
1 public Boolean(String s) { 2 this(parseBoolean(s)); 3 }
第一個比較好理解,那第二個的parseBoolean(s)是什麼方法呢?
跟蹤進去看,在該方法裏,會將String字符串作比較,只有s爲「true」時傳進去,纔會返回一個boolean值。
1 public static boolean parseBoolean(String s) { 2 return ((s != null) && s.equalsIgnoreCase("true")); 3 }
Boolean的hash值是比較有意思:
1 @Override 2 public int hashCode() { 3 return Boolean.hashCode(value); 4 }
當true時,獲得的是1231,當false,獲得的是1237。
1 public static int hashCode(boolean value) { 2 return value ? 1231 : 1237; 3 }
那麼,問題來了,爲啥Boolean的hash值爲何選擇這兩個數字呢?
主要緣由是,1231與1237是比較大的素數,而選擇素數是爲了在散列桶中最好地分配數據,其實Boolean也能夠選擇其餘素數做爲其哈希值,聽說這純粹是做者的我的喜愛。
有個有趣的地方是,當
true: 1231 => 1 + 2 + 3 + 1 = 7;
7-是歐洲傳統中的幸運數字;
false: 1237 => 1 + 2 + 3 + 7 = 13;
13則是不吉祥的數字;