Java中Boolean和boolean的區(qū)別詳析
前言
?上次一個同學(xué)問,Boolean 類型的值不是只有 true 和 false 兩種嗎?為什么他定義的屬性出現(xiàn)了 null 值?
我們應(yīng)該先明確一點,boolean 是 Java 的基本數(shù)據(jù)類型,Boolean 是 Java 的一個類。boolean 類型會在“賦零值”階段給屬性賦 false。而 Boolean 是一個類,會在“賦零值”階段給對象賦 null。
如果是靜態(tài)屬性,會在類加載時被賦值。如果是普通類屬性,會在實例化對象時賦值。這兩點可以了解一下“類加載機制”和“對象創(chuàng)建過程”。
類加載機制:
- 加載:根據(jù)類的全名獲取類的二進制字節(jié)流,將類加載進內(nèi)存并在堆中生成一個代表這個類的 Class 對象,作為方法區(qū)數(shù)據(jù)的訪問入口
- 驗證:驗證 class 文件中的字節(jié)流是否符合 JVM 規(guī)范
- 準(zhǔn)備:在方法區(qū)中為類的靜態(tài)屬性分配內(nèi)存,并初始化默認(rèn)值(boolean 的默認(rèn)值是 false,Boolean 的默認(rèn)值是 null)
- 解析:將常量池中的符號引用轉(zhuǎn)化為直接引用,可以理解為對象引用轉(zhuǎn)成指針
- 初始化:真正開始執(zhí)行類中的代碼,靜態(tài)屬性賦值和靜態(tài)塊
對象實例化過程:
- 檢查類是否已經(jīng)被加載(雙親委派)
- 給對象分配內(nèi)存空間(指針碰撞)
- 零值初始化(false / null)
- 設(shè)置對象頭(對象分代年齡等信息)
- 執(zhí)行 <init> 方法(屬性初始化,語句塊和構(gòu)造方法)
所以說,Boolean只是被加載了,還沒有被實例化,在被實例化之前并沒有分配內(nèi)存,所以是 null
接下來我們可以看看 Boolean 的屬性和構(gòu)造方法,了解一下它如何包裝 boolean
// final boolean類型的屬性,通過構(gòu)造方法注入值
private final boolean value;
?
// 構(gòu)造方法 Boolean a = true 實際上就是調(diào)用這個方法
public Boolean(boolean value) {
this.value = value;
}
?
// 構(gòu)造方法
public Boolean(String s) {
this(parseBoolean(s));
}
對于其他的屬性和方法,可以自行查看都比較簡單
關(guān)于 Boolean 使用過程中有一個風(fēng)險點,阿里巴巴開發(fā)手冊也寫得非常好

簡單來說就是,boolean 定義的屬性一定要有值,如果 Boolean 對象值為 null,解包過程中就會出現(xiàn)NPE。
想象一種場景:你女票問你:你愛我嗎?但你沒聽清。如果你是 Boolean 就會回答,我沒聽清(null),如果你是 boolean 就會回答,不愛了 (false)
之后就會被打。
補充:Boolean與boolean性能探究
針對Boolean與true
單純從源碼角度看不出來那個性能上更加好;大布爾也是初始化了兩個static對象
源碼截圖如下:

寫了一個測試類:測試方式(獲取大布爾類型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次的比較結(jié)果---->"+get());
}
}
執(zhí)行結(jié)果如下圖:

總結(jié)
到此這篇關(guān)于Java中Boolean和boolean區(qū)別的文章就介紹到這了,更多相關(guān)Java Boolean和boolean區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中的PropertySource原理詳解
這篇文章主要介紹了SpringBoot中的PropertySource原理詳解,PropertySource?是一個非常重要的概念,它允許您在應(yīng)用程序中定義屬性,并將這些屬性注入到?Spring?環(huán)境中,需要的朋友可以參考下2023-07-07
springboot lua檢查redis庫存的實現(xiàn)示例
本文主要介紹了springboot lua檢查redis庫存的實現(xiàn)示例,為了優(yōu)化性能,通過Lua腳本實現(xiàn)對多個馬戲場次下的座位等席的庫存余量檢查,感興趣的可以了解一下2024-09-09
Shiro:自定義Realm實現(xiàn)權(quán)限管理方式
這篇文章主要介紹了Shiro:自定義Realm實現(xiàn)權(quán)限管理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

