眾所周知,java對常見的原始數據類型都提供了對應的封裝類型,增加一些常用的特性(如 計算hash值、比較相等、類型轉換等),以擴展他們對數據處理的能力,使得他們更好地適應面向對象編程的各種場景。今天,我們首先來學習 boolean 布爾型對應的封裝類型。
1. 定義
首先來看看定義(下圖),可以看到,Boolean 實現了序列化和比較接口,說明一個 Boolean 對象是可以序列化的;是可以比較大小的;另外,注意 final 修飾符,Boolean 不可被繼承。
2. 屬性
下圖是 Boolean 類型的重要屬性字段:
2.1. 枚舉靜態引用
我們知道,原始 boolean 類型只存在兩個值:true 和 false。既然只有兩種值,那么封裝類就干脆定義兩個靜態的引用,分別保持對兩個值對象實例的引用,它們會在類加載的時候被初始化。
2.2. 值
注意 value 字段的 final 修飾符,說明一個 Boolean 類型對象的值是不允許改變的。
2.3. 類型引用
我們知道,虛擬機在類加載的時候,會為每個類創建一個 Class 對象,用於在運行時表示這個類的類型信息(比如:類名、全類名、有哪些修飾符、有哪些方法和屬性、有哪些注解等),那么原始數據類型也不例外,上圖 TYPE 就是保持對這個 Class 對象的引用。
3. 構造方法
Boolean 有兩個構造方法,分別接收原始數據類型 boolean 值和字符串 “true”或者“false”(忽略大小寫)如果傳的字符串為 null,那么自動認為該對象值為 false。
上圖中紅框中注釋說明了,不建議使用構造方法,而建議使用靜態工廠 valueOf(boolean) 方法,下面是 valueOf 方法代碼。可以看出,靜態工廠方法會直接返回類屬性 TRUE 或 FALSE 引用的靜態對象實例,他們在類加載的時候已經實例化。這樣就不需要再分配內存空間了,節省了時間和空間。
4. 普通方法
boolean |
booleanValue()
將此 Boolean 對象的值作為布爾原始值返回。
|
static int |
compare(boolean x, boolean y)
比較兩個 boolean 值。
|
int |
compareTo(Boolean b)
將此 Boolean 實例與另一個實例進行比較。
|
boolean |
equals(Object obj)
返回 true 當且僅當參數不是 null ,並且是一個 Boolean 對象,表示與此對象相同的 boolean 值。
|
static boolean |
getBoolean(String name)
返回 true 當且僅當由參數命名的系統屬性存在且等於字符串 "true" 。
|
int |
hashCode()
返回此 Boolean 對象的哈希碼。
|
static int |
hashCode(boolean value)
返回一個 boolean 值的哈希碼; 兼容Boolean.hashCode() 。
|
static boolean |
logicalAnd(boolean a, boolean b)
返回將邏輯AND運算符應用於指定的 boolean 操作數的結果。
|
static boolean |
logicalOr(boolean a, boolean b)
返回將邏輯OR運算符應用於指定的 boolean 操作數的結果。
|
static boolean |
logicalXor(boolean a, boolean b)
返回將邏輯XOR運算符應用於指定的 boolean 操作數的結果。
|
static boolean |
parseBoolean(String s)
將字符串參數解析為布爾值。
|
String |
toString()
返回一個 String 此布爾值的 String 對象。
|
static String |
toString(boolean b)
返回一個 String 指定布爾值的 String 對象。
|
static Boolean |
valueOf(boolean b)
返回一個 Boolean 指定的 boolean 值的 Boolean 實例。
|
static Boolean |
valueOf(String s)
返回一個 Boolean ,其值由指定的字符串表示。
|
4.1. compare 和 compareTo
前面定義中我們已知,Boolean 對象是可以比較大小的(這個有些意外,平時開發中好像從來沒有對布爾類型做過大小比較),那么到底是怎么一個比較規則呢?下面先看一下比較大代碼:
public int compareTo(Boolean b) { return compare(this.value, b.value); } public static int compare(boolean x, boolean y) { return (x == y) ? 0 : (x ? 1 : -1); }
可以看出:對於 compareTo(Boolean b) 方法,當當前對象和參數b指定對象同為 true 或者同為 false 時,返回0;否則當當前對象值為 true 時返回 1;否則返回 -1。根據 comparable 接口的常規約定:@return a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. 我們可以看出,java在對布爾值比較大小時認為 true > false(姑且可以這么解釋以方便記憶 compareTo 方法的規則,現實中真假應該是沒有大小之說的吧)
4.2. getBoolean
該方法嘗試獲取一個由參數指定的名稱的布爾類型的系統屬性值(詳細的可以去了解 System 類),如果該屬性不存在或者不是布爾類型(所謂布爾類型,就是忽略大小寫的 “true” 或者 “false” 字符串),都會返回 false;否則返回該系統屬性的布爾值。代碼:
* If there is no property with the specified name, or if the specified * name is empty or null, then {@code false} is returned. * * @param name the system property name. * @return the {@code boolean} value of the system property. * @throws SecurityException for the same reasons as * {@link System#getProperty(String) System.getProperty} * @see java.lang.System#getProperty(java.lang.String) * @see java.lang.System#getProperty(java.lang.String, java.lang.String) */ public static boolean getBoolean(String name) { boolean result = false; try { result = parseBoolean(System.getProperty(name)); } catch (IllegalArgumentException | NullPointerException e) { } return result; }
4.3. hashCode 方法
hashCode 是頂級類 Object 定義的基礎方法之一,Boolean 對該方法進行了重寫。該方法只可能返回 1231 和 1237 兩個值。既然布爾只有兩種值,那么 hashCode 也只有兩個值,理所當然,順理成章。(如果想問為什么偏偏是這兩個數的朋友們就去了解一下 hashCode 方法設計的初衷和哈希表吧)
/** * Returns a hash code for this {@code Boolean} object. * * @return the integer {@code 1231} if this object represents * {@code true}; returns the integer {@code 1237} if this * object represents {@code false}. */ @Override public int hashCode() { return Boolean.hashCode(value); } /** * Returns a hash code for a {@code boolean} value; compatible with * {@code Boolean.hashCode()}. * * @param value the value to hash * @return a hash code value for a {@code boolean} value. * @since 1.8 */ public static int hashCode(boolean value) { return value ? 1231 : 1237; }
4.4. equals 方法
Boolean 類也重寫了 equals 方法,當且僅當參數指定的對象也是 Boolean 實例且與當前對象真假值相同時返回 true。
public boolean equals(Object obj) { if (obj instanceof Boolean) { return value == ((Boolean)obj).booleanValue(); } return false; }
很顯然,Boolean 對象遵循 hashCode 和 equals 方法的常規約定。
5. 划重點
5.1. Boolean 是最終類,不可被繼承;
5.2. 構造 Boolean 對象,建議使用靜態工廠方法 valueOf ,而不是構造方法(因為 valueOf 使用靜態緩存),這樣比較節省時間和空間;
5.3. Boolean 實現了 comparable 接口,可以比較大小,java 默認為 true> false;
5.4. Boolean 的 hashCode() 方法返回 1231(true 時)或 1237(false 時),且與 equals 方法遵循常規約定;