簡體   English   中英

將 Boolean.TRUE/Boolean.FALSE 或 true/false 分配給 boolean 原始變量更好嗎?

[英]Is it better to assign Boolean.TRUE/Boolean.FALSE or true/false to a boolean primitive variable?

在做一些代碼審查時,我偶然發現了這個:

人們通常將Boolean.TRUEBoolean.FALSE值分配給盒裝的 boolean 變量,但對原始變量使用true / false 最好的方法是什么?

根據與我合作的一位架構師的說法 - 他說每次您將true / false分配給變量時,都會創建一個新的 Boolean 實例。 如果我們將 boolean 變量分配給 static 個實例,我們可以跳過它 - Boolean.FALSE / Boolean.TRUE 如果變量是原始變量,則完成自動拆箱。

自動拆箱是否比 boolean 變量的初始化更快? 差異不大,我認為這只是代碼的微優化,但我想了解更多相關信息。

你是對的,性能問題主要是分散注意力。

要了解發生了什么,讓我們看一下 Java 類型系統中基元及其框是如何建模的。

C extends D時,這意味着CD ,或者CD子類型 Integer分配給Number時,不需要轉換,因為Integer是一個Number 在幕后, IntegerNumber都由指針(對象引用)表示,賦值只是指針副本。

但是, booleanBoolean之間的關系是不同的。 沒有extends 沒有is-a 相反,有裝箱拆箱轉換,它們在某些上下文中應用(例如,賦值、方法參數)。它們的表示是不同的。 因此,當您在booleanBoolean之間進行轉換時,形式會發生變化(從 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.TRUEBoolean.FALSE被駐留。

如果您的架構師主要針對性能問題向您提供此建議,那么他/她就被誤導了。 如果他們的建議更多是出於簡單性的考慮——即使用不需要轉換的正確類型的值同樣容易——這是明智的。

在進行一些代碼審查時,我偶然發現了這一點:

人們通常將Boolean.TRUEBoolean.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM