![](/img/trans.png)
[英]Instantiating Boolean object in Java: Boolean.TRUE and Boolean.FALSE vs primitives
[英]Is it better to assign Boolean.TRUE/Boolean.FALSE or true/false to a boolean primitive variable?
在做一些代碼審查時,我偶然發現了這個:
人們通常將Boolean.TRUE
或Boolean.FALSE
值分配給盒裝的 boolean 變量,但對原始變量使用true
/ false
。 最好的方法是什么?
根據與我合作的一位架構師的說法 - 他說每次您將true
/ false
分配給變量時,都會創建一個新的 Boolean 實例。 如果我們將 boolean 變量分配給 static 個實例,我們可以跳過它 - Boolean.FALSE
/ Boolean.TRUE
。 如果變量是原始變量,則完成自動拆箱。
自動拆箱是否比 boolean 變量的初始化更快? 差異不大,我認為這只是代碼的微優化,但我想了解更多相關信息。
你是對的,性能問題主要是分散注意力。
要了解發生了什么,讓我們看一下 Java 類型系統中基元及其框是如何建模的。
當C extends D
時,這意味着C
是D
,或者C
是D
的子類型。 將Integer
分配給Number
時,不需要轉換,因為Integer
是一個Number
。 在幕后, Integer
和Number
都由指針(對象引用)表示,賦值只是指針副本。
但是, boolean
和Boolean
之間的關系是不同的。 沒有extends
; 沒有is-a 。 相反,有裝箱和拆箱轉換,它們在某些上下文中應用(例如,賦值、方法參數)。它們的表示是不同的。 因此,當您在boolean
和Boolean
之間進行轉換時,形式會發生變化(從 boolean 值的直接表示,變為指向包含 object header 和 boolean 的堆節點的指針。) "; 這不僅僅是復制一個詞。 (也就是說,如果這是您程序中的性能瓶頸,那么您的問題就更大了——也就是說,您的程序做的並不多。)
當你分配
boolean b = true;
要么
Boolean bb = Boolean.TRUE;
=
兩側的類型相同——第一個示例中為boolean
,第二個示例中為Boolean
並且沒有轉換。 當你做
boolean b = Boolean.TRUE;
要么
Boolean bb = true;
類型不同,需要轉換。 編譯器默默地將這些翻譯成:
boolean b = Boolean.TRUE.booleanValue();
和
Boolean bb = Boolean.valueOf(true);
在boolean
的特定情況下,與其他原語相比,性能問題的相關性甚至更低,因為只有兩個 boolean 值,常量Boolean.TRUE
和Boolean.FALSE
被駐留。
如果您的架構師主要針對性能問題向您提供此建議,那么他/她就被誤導了。 如果他們的建議更多是出於簡單性的考慮——即使用不需要轉換的正確類型的值同樣容易——這是明智的。
在進行一些代碼審查時,我偶然發現了這一點:
人們通常將Boolean.TRUE
或Boolean.FALSE
值分配給裝箱的 boolean 變量,但對原始變量使用true
/ false
。 最好的方法是什么?
根據我合作過的一位建築師的說法 - 他說每次你將true
/ false
分配給一個變量時,都會創建一個 Boolean 的新實例。 如果我們將 boolean 變量分配給 static 實例 - Boolean.FALSE
/ Boolean.TRUE
如果變量是原始變量,則會完成自動拆箱。
自動拆箱是否比 boolean 變量的初始化更快? 差異不大,我認為這只是代碼的微優化,但我想了解更多相關信息。
如果您有原始 boolean 變量,則分配 true 或 false 以避免執行拆箱。
如果您有包裝器 Boolean 變量,則使用 Boolean.TRUE 或 Boolean.FALSE 來避免執行新的 object 的裝箱和/或實例化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.