首頁 > Java > java教程 > 主體

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

Patricia Arquette
發布: 2024-10-10 08:09:02
原創
447 人瀏覽過

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

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

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

主要區別

  • 身分與身分價值:
    原語:它們沒有身分;具有相同值的兩個基元總是相等。
    打包:它們是對象,有身份;兩個對象可以具有相同的值但不同的標識。

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

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

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

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

有問題的範例:

Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);

登入後複製

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

解:
使用 Integer 類別的 CompareTo 方法或實用方法。

Comparator<Integer> naturalOrder = Integer::compare;

登入後複製

或者,修正原始比較器:

Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> {
    int i = iBoxed;
    int j = jBoxed;
    return (i < j) ? -1 : ((i == j) ? 0 : 1);
};

登入後複製

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 <= Integer.MAX_VALUE; i++) {
    sum += i;
}
System.out.println(sum);

登入後複製

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

影響:程式碼速度變慢且記憶體使用過多。
解:
在密集操作中對局部變數使用原始型別。

long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    sum += i;
}
System.out.println(sum);

登入後複製

何時使用封裝類型

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

良好實踐

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

總結
原型:
更簡單、更快。
它們不能為空。
他們沒有身份(只有價值)。

包裝類型:
在集合和通用 API 中使用時需要。
它們可以為空。
他們有對象身分。

以上是Item 喜歡原始類型而不是打包的原始類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!