Boolean源碼解剖學

一.類繼承java

Boolean的源碼類定義部分以下:ide

  1 public final class Boolean implements java.io.Serializable,
  2                                       Comparable<Boolean>

在IDEA生成其類繼承圖:學習

clipboard

根據以上信息能夠得知: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源碼定義瞭如下的字段與方法,下面將逐一學習分析:

clipboard

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則是不吉祥的數字;

相關文章
相關標籤/搜索