首頁 > 軟體

Java中Boolean和boolean的區別詳析

2022-07-12 22:07:28

前言

​上次一個同學問,Boolean 型別的值不是隻有 true 和 false 兩種嗎?為什麼他定義的屬性出現了 null 值?

我們應該先明確一點,boolean 是 Java 的基本資料型別,Boolean 是 Java 的一個類。boolean 型別會在“賦零值”階段給屬性賦 false。而 Boolean 是一個類,會在“賦零值”階段給物件賦 null。

如果是靜態屬性,會在類載入時被賦值。如果是普通類屬性,會在範例化物件時賦值。這兩點可以瞭解一下“類載入機制”和“物件建立過程”。

類載入機制:

  • 載入:根據類的全名獲取類的二進位制位元組流,將類載入進記憶體並在堆中生成一個代表這個類的 Class 物件,作為方法區資料的存取入口
  • 驗證:驗證 class 檔案中的位元組流是否符合 JVM 規範
  • 準備:在方法區中為類的靜態屬性分配記憶體,並初始化預設值(boolean 的預設值是 false,Boolean 的預設值是 null)
  • 解析:將常數池中的符號參照轉化為直接參照,可以理解為物件參照轉成指標
  • 初始化:真正開始執行類中的程式碼,靜態屬性賦值和靜態塊

物件範例化過程:

  • 檢查類是否已經被載入(雙親委派)
  • 給物件分配記憶體空間(指標碰撞)
  • 零值初始化(false / null)
  • 設定物件頭(物件分代年齡等資訊)
  • 執行 <init> 方法(屬性初始化,語句塊和構造方法)

所以說,Boolean只是被載入了,還沒有被範例化,在被範例化之前並沒有分配記憶體,所以是 null

接下來我們可以看看 Boolean 的屬性和構造方法,瞭解一下它如何包裝 boolean

// final boolean型別的屬性,通過構造方法注入值
private final boolean value;
​
// 構造方法 Boolean a = true 實際上就是呼叫這個方法
public Boolean(boolean value) {
    this.value = value;
}
​
// 構造方法
public Boolean(String s) {
    this(parseBoolean(s));
}

對於其他的屬性和方法,可以自行檢視都比較簡單

關於 Boolean 使用過程中有一個風險點,阿里巴巴開發手冊也寫得非常好

簡單來說就是,boolean 定義的屬性一定要有值,如果 Boolean 物件值為 null,解包過程中就會出現NPE。

想象一種場景:你女票問你:你愛我嗎?但你沒聽清。如果你是 Boolean 就會回答,我沒聽清(null),如果你是 boolean 就會回答,不愛了 (false)

之後就會被打。

補充:Boolean與boolean效能探究

針對Boolean與true

單純從原始碼角度看不出來那個效能上更加好;大布林也是初始化了兩個static物件

原始碼截圖如下:

寫了一個測試類:測試方式(獲取大布林型別true的時間 獲取小布林型別true的時間,通過100、1000、10000、100000次 看看那個時間更少的次數更多)

測試程式碼如下:

public class Test {	
	/**
	 * 方法一
	 * 
	 * @return
	 */
	public static Boolean A() {
		return Boolean.TRUE;
	}
	/**
	 * 方法二
	 * 
	 * @return
	 */
	public static boolean D() {
		return true;
	}
	public static String get() {
		long i = 0L;
		long j = 0L;
		for (int n = 0; n < 100000; n++) {
			long startTime = System.nanoTime();
			D();
			long endTime = System.nanoTime();
			long booleanTime = endTime - startTime;
			
			long start = System.nanoTime();
			A();
			long end = System.nanoTime();
			long booleanca = end - start;
			
			
			if (booleanca > booleanTime) {
				i = i + 1;
			} else {
				j = j + 1;
			}
		}
		return i+" "+j;
	}
	public static void main(String[] args) {
        System.out.println("---100000次的比較結果---->"+get());
	}
}

執行結果如下圖:

總結

到此這篇關於Java中Boolean和boolean區別的文章就介紹到這了,更多相關Java Boolean和boolean區別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com