原始型別與原型打包的原始型別
主要區別
身分與身分價值:
原語:它們沒有身分;具有相同值的兩個基元總是相等。
打包:它們是對象,有身份;兩個對象可以具有相同的值但不同的標識。
空值:
基元: 總是有一個預設值(例如,int 為 0)。
打包:可能為null,如果處理不當可能會導致NullPointerException異常。
表現:
原語:在時間和空間上更有效率。
打包: 由於建立額外物件而引入開銷。
混合基元和包時的常見問題
有問題的範例:
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);
何時使用封裝類型
良好實踐
總結
原型:
更簡單、更快。
它們不能為空。
他們沒有身份(只有價值)。
包裝類型:
在集合和通用 API 中使用時需要。
它們可以為空。
他們有對象身分。
以上是Item 喜歡原始類型而不是打包的原始類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!