」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Item 喜歡原始類型而不是打包的原始類型

Item 喜歡原始類型而不是打包的原始類型

發佈於2024-11-11
瀏覽:326

Item  Dê preferência aos tipos primitivos em vez dos tipos primitivos empacotados

原始型與原始型打包原始型別

  • 基本型式:int、double、boolean 等
  • 打包基元類型:整數、雙精度、布林值等
  • Java 有雙重型別系統:原始型別和參考型別(物件)。
  • 每個基本型別都有一個對應的包裝類別。

主要差異

  • 身分與身分價值:
    原語:它們沒有身份;具有相同值的兩個基元始終相等。
    打包:它們是物件並且有一個標識;兩個物件可以具有相同的值但不同的標識。

  • 空值:
    基元: 總是有一個預設值(例如,int 為 0)。
    Packed: 可能為 null,如果處理不當可能會導致 NullPointerException 例外。

  • 表現:
    原語:在時間和空間上更有效率。
    打包: 由於建立額外物件而引入開銷。

混合基元和包時的常見問題

  • 1.身份而非價值比較
  • 當比較使用==打包的物件時,您正在比較物件引用,而不是值。這可能會導致意想不到的結果。

有問題的例子:

Comparator naturalOrder = (i, j) -> (i 



問題: 比較 i == j 比較引用,而不是值。
不正確的行為:naturalOrder.compare(new Integer(42), new Integer(42)) 傳回 1 而不是 0。

解決方案:
使用 Integer.
類別的 CompareTo 方法或實用程式方法

Comparator naturalOrder = Integer::compare;

或者,修正原先的比較器:

Comparator naturalOrder = (iBoxed, jBoxed) -> {
    int i = iBoxed;
    int j = jBoxed;
    return (i 



2.自動拆箱與 NullPointerException
當使用可以為 null 的打包類型時,如果物件為 null,自動拆箱可能會引發異常。

有問題的例子:

Integer i = null;
if (i == 42) {
    System.out.println("Inacreditável");
}

問題: i 為空;與 42 比較時,發生 null 自動拆箱,導致 NullPointerException.
解決方案:盡可能使用原始型別。

int i = 0;
if (i == 42) {
    System.out.println("Inacreditável");
}

3.由於自動裝箱/拆箱導致性能下降
在密集型操作中無意中使用包裝類型可能會由於自動裝箱和不必要的物件創建而導致效能下降。

有問題的例子:

Long sum = 0L;
for (long i = 0; i 



問題: sum 是一個壓縮的 Long;在每次迭代中,都會發生自動裝箱/拆箱。

影響:程式碼速度慢很多,記憶體使用量過多。
解決方案:
在密集操作中使用局部變數的原始類型。

Long sum = 0L;
for (long i = 0; i 



何時使用封裝類型

  • 集合:在泛型集合中不能使用原始型別(例如列表)。
  • 泛型參數:泛型類型不支援原始型別(例如ThreadLocal)。
  • 需要物件的 API:某些 API 需要物件而不是原始類型。

良好實務

  • 首選原始類型:只要有可能,就使用原始類型以實現簡單性和效率。
  • 請小心自動裝箱/拆箱:自動裝箱可減少冗長,但可能會引入微妙的錯誤。
  • 避免在 Wrapped 中與 == 進行比較:使用 equals() 等方法或比較展開的值。
  • 檢查空值:使用封裝類型時,請注意它們可能為空並導致 NullPointerException。

概括
原始型別:
更簡單、更快。
它們不能為空。
他們沒有身分(只有價值)。

打包型:
需要在集合和通用 API 中使用。
它們可以為空。
他們有對象標識。

版本聲明 本文轉載於:https://dev.to/giselecoder/item-61-de-preferencia-aos-tipos-primitivos-em-vez-dostipos-primitivos-empacotados-34fk?1如有侵犯,請洽study_golang@163 .com刪除
最新教學 更多>
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-07-18
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-07-18
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-18
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-07-18
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-07-18
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-07-18
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    程式設計 發佈於2025-07-18
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-18
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在Silverlight應用程序中,嘗試使用LINQ建立LINQ連接以錯誤而實現的數據庫”,無法找到查詢模式的實現。”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例...
    程式設計 發佈於2025-07-18
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-07-18
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-07-18
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-07-18
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-07-18
  • 用戶本地時間格式及時區偏移顯示指南
    用戶本地時間格式及時區偏移顯示指南
    在用戶的語言環境格式中顯示日期/時間,並使用時間偏移在向最終用戶展示日期和時間時,以其localzone and格式顯示它們至關重要。這確保了不同地理位置的清晰度和無縫用戶體驗。以下是使用JavaScript實現此目的的方法。 方法:推薦方法是處理客戶端的Javascript中的日期/時間格式化和...
    程式設計 發佈於2025-07-18
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
    程式設計 發佈於2025-07-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3