溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Boolean和boolean的區(qū)別是什么

發(fā)布時間:2022-07-13 10:39:59 來源:億速云 閱讀:328 作者:iii 欄目:開發(fā)技術

這篇“Java中Boolean和boolean的區(qū)別是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java中Boolean和boolean的區(qū)別是什么”文章吧。

前言

有人問,Boolean 類型的值不是只有 true 和 false 兩種嗎?為什么他定義的屬性出現(xiàn)了 null 值?

我們應該先明確一點,boolean 是 Java 的基本數(shù)據(jù)類型,Boolean 是 Java 的一個類。boolean 類型會在“賦零值”階段給屬性賦 false。而 Boolean 是一個類,會在“賦零值”階段給對象賦 null。

如果是靜態(tài)屬性,會在類加載時被賦值。如果是普通類屬性,會在實例化對象時賦值。這兩點可以了解一下“類加載機制”和“對象創(chuàng)建過程”。

類加載機制:

  • 加載:根據(jù)類的全名獲取類的二進制字節(jié)流,將類加載進內存并在堆中生成一個代表這個類的 Class 對象,作為方法區(qū)數(shù)據(jù)的訪問入口

  • 驗證:驗證 class 文件中的字節(jié)流是否符合 JVM 規(guī)范

  • 準備:在方法區(qū)中為類的靜態(tài)屬性分配內存,并初始化默認值(boolean 的默認值是 false,Boolean 的默認值是 null)

  • 解析:將常量池中的符號引用轉化為直接引用,可以理解為對象引用轉成指針

  • 初始化:真正開始執(zhí)行類中的代碼,靜態(tài)屬性賦值和靜態(tài)塊

對象實例化過程:

  • 檢查類是否已經被加載(雙親委派)

  • 給對象分配內存空間(指針碰撞)

  • 零值初始化(false / null)

  • 設置對象頭(對象分代年齡等信息)

  • 執(zhí)行 <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 使用過程中有一個風險點,阿里巴巴開發(fā)手冊也寫得非常好

Java中Boolean和boolean的區(qū)別是什么

簡單來說就是,boolean 定義的屬性一定要有值,如果 Boolean 對象值為 null,解包過程中就會出現(xiàn)NPE。

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

之后就會被打。

補充:Boolean與boolean性能探究

針對Boolean與true

單純從源碼角度看不出來那個性能上更加好;大布爾也是初始化了兩個static對象

源碼截圖如下:

Java中Boolean和boolean的區(qū)別是什么

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

測試代碼如下:

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());
	}
}

執(zhí)行結果如下圖:

Java中Boolean和boolean的區(qū)別是什么

以上就是關于“Java中Boolean和boolean的區(qū)別是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI