最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談JAVA最常見(jiàn)的裝箱/拆箱坑

 更新時(shí)間:2026年03月17日 08:50:13   作者:肯戳加勾  
本文主要介紹了淺談JAVA最常見(jiàn)的裝箱/拆箱坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. Integer / Long 判等用 ==

Integer a = 128;
Integer b = 128;
System.out.println(a == b); // false

很多人以為是 true,但這是比較“對(duì)象地址”,不是比較值。
正確寫(xiě)法:

Objects.equals(a, b)

或者:

a.equals(b)

但 a.equals(b) 要注意 a 不能為 null,所以更穩(wěn)的是:

Objects.equals(a, b)

這個(gè)坑在 Long id、Integer status 上特別常見(jiàn)。

2. 包裝類型和基本類型比較觸發(fā)拆箱,null 會(huì)空指針

Integer status = null;

if (status == 1) {
    ...
}

這會(huì)報(bào) NullPointerException。 因?yàn)樗鼤?huì)自動(dòng)拆箱成:

status.intValue() == 1

更安全的寫(xiě)法:

Integer.valueOf(1).equals(status)

或者:

Objects.equals(status, 1)

3. Boolean 當(dāng)成 boolean 用,null 會(huì)炸

Boolean deleted = null;

if (deleted) {
    ...
}

這也會(huì)空指針。因?yàn)?Java 會(huì)自動(dòng)拆箱:

if (deleted.booleanValue()) {
    ...
}

安全寫(xiě)法:

Boolean.TRUE.equals(deleted)

如果判斷 false:

Boolean.FALSE.equals(deleted)

這個(gè)在配置項(xiàng)、開(kāi)關(guān)字段里特別常見(jiàn)。

4. 數(shù)據(jù)庫(kù)字段是 Integer / Long,直接賦給基本類型

Integer dbValue = null;
int value = dbValue;

這會(huì)空指針,因?yàn)檫@里發(fā)生了拆箱。

正確做法:

int value = dbValue == null ? 0 : dbValue;

或者保持包裝類型:

Integer value = dbValue;

如果數(shù)據(jù)庫(kù)字段允許為空,Java 實(shí)體通常就應(yīng)該用包裝類型,不要用基本類型。

5. 集合里必須用包裝類型,不能用基本類型

這個(gè)不算坑,但很常見(jiàn)

List<int> ids = new ArrayList<>();

這是錯(cuò)的,Java 泛型不能用基本類型。

只能寫(xiě):

List<Integer> ids = new ArrayList<>();

這里就涉及自動(dòng)裝箱/拆箱,比如:

ids.add(1); // 自動(dòng)裝箱成 Integer
int x = ids.get(0); // 自動(dòng)拆箱成 int

如果 ids.get(0) 返回 null,這里也可能炸。

6. 三元表達(dá)式里混用包裝類型和基本類型

Integer a = null;
int b = true ? a : 0;

這個(gè)也可能空指針,因?yàn)?nbsp;a 會(huì)被拆箱成 int。

這種代碼在“默認(rèn)值處理”時(shí)很容易寫(xiě)出來(lái)。更穩(wěn)的寫(xiě)法:

int b = a == null ? 0 : a;

7. Stream / Lambda 里隱式拆箱

List<Integer> list = Arrays.asList(1, 2, null, 4);
int sum = list.stream().mapToInt(Integer::intValue).sum();

這里如果有 null,會(huì)直接空指針。

安全一點(diǎn)要先過(guò)濾:

int sum = list.stream()
        .filter(Objects::nonNull)
        .mapToInt(Integer::intValue)
        .sum();

8. 狀態(tài)字段來(lái)自數(shù)據(jù)庫(kù),直接 switch 或運(yùn)算

Integer status = null;
switch (status) {
    case 1 -> ...
}

這也會(huì)因?yàn)椴鹣鋱?bào)錯(cuò)。

所以狀態(tài)字段如果可能為 null,先判空再處理。

項(xiàng)目里幾個(gè)實(shí)用的建議

  1. Long、Integer、Boolean 比較值時(shí),優(yōu)先用 Objects.equals(...)
  2. 狀態(tài)判斷常量寫(xiě)左邊,比如:
Integer.valueOf(1).equals(status)
  1. Boolean 判斷優(yōu)先寫(xiě):
Boolean.TRUE.equals(flag)
  1. 數(shù)據(jù)庫(kù)可空字段,Java 實(shí)體盡量用包裝類型,不要用基本類型
  2. 只要看到 == 1、== 0、if (flag),就要想一下會(huì)不會(huì)拆箱

到此這篇關(guān)于淺談JAVA最常見(jiàn)的裝箱/拆箱坑的文章就介紹到這了,更多相關(guān)JAVA 裝箱/拆箱坑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

闻喜县| 宜城市| 宣恩县| 乌鲁木齐县| 镇原县| 卓尼县| 睢宁县| 屯门区| 杨浦区| 甘孜| 施秉县| 襄城县| 牡丹江市| 广南县| 江西省| 开鲁县| 修武县| 夏河县| 清原| 沂南县| 顺平县| 绥江县| 托克逊县| 望城县| 嘉黎县| 建德市| 定西市| 荆门市| 柳河县| 伊金霍洛旗| 青河县| 长葛市| 马公市| 宾阳县| 枣庄市| 滨海县| 颍上县| 会宁县| 兴安盟| 碌曲县| 延庆县|