java封裝數據類型——Boolean


  眾所周知,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 方法遵循常規約定;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM