1. 程式人生 > 其它 >java中如何判斷物件中每一個欄位都為空_重新認識Java的包裝類

java中如何判斷物件中每一個欄位都為空_重新認識Java的包裝類

技術標籤:java中如何判斷物件中每一個欄位都為空

包裝類

Java中每一種基本型別都會對應一個唯一的包裝類,基本型別與其包裝類都可以通過包裝類中的靜態或者成員方法進行轉換。每種基本型別及其包裝類的對應關係如下,值得注意的是,所有的包裝類都是final修飾的,也就是它們都是無法被繼承和重寫的。

30d704044bd6ade4b437462961524c90.png

包裝類與基本型別的轉換

從原始碼的角度來看,基礎型別和包裝型別都可以通過賦值語法賦值給對立的變數型別,如下面的程式碼所示。

Integer a = 1;int a = new Integer(1);

這種語法是可以通過編譯的。但是,Java作為一種強型別的語言,物件直接賦值給引用型別變數,而基礎資料只能賦值給基本型別變數,這個是毫無異議的。那麼基本型別和包裝型別為什麼可以直接相互賦值呢?這其實是Java中的一種“語法糖”。“語法糖”是指計算機語言中新增的某種語法,這種語法對語言的功能並沒有影響,但是更方便程式設計師使用。通常來說使用語法糖能夠增加程式的可讀性,從而減少程式程式碼出錯的機會(來自百度百科)。換句話說,這其實是一種障眼法,那麼實際上是怎麼樣的呢?下面是Integer a = 1;語句編譯的位元組碼。

0: iconst_11: invokestatic #2 4: astore_1

首先,生成一個常量1,然後呼叫Integer.valueOf(int)方法返回Integer物件,最後將物件的地址(引用)賦值給變數a。Integer a = 1;其實相當於Integer a = Integer.valueOf(1);。

其他的包裝類都是類似的,下表是所有包裝類中的型別轉換方法。

f6e3c8344ccc84b72dbf75e82e921f17.png

“神奇”的包裝類

如果不瞭解包裝類中的一些機制,我們有時會碰到一些莫名其妙的問題,丈二和尚——摸不著頭腦。

“莫名其妙”的NullPointException

在筆者開發經歷中,碰到過不少因為請求引數或者介面定義欄位設定為int(或者其他基本型別)而導致NullPointException。程式碼大致地執行步驟如下所示,當然不會跟這個完全一樣。

Integer a = null;...int b = a; // 丟擲NullPointException

上面的程式碼可以編譯通過,但是會丟擲空指標異常(NullPointException)。前面已經說過了,int b = a實際上是int b = a.intValue(),由於a的引用值為null,在空物件上呼叫方法就會丟擲NullPointException。

兩個包裝類引用相等性

在Java中,“==”符號判斷的記憶體地址所對應的值得相等性,具體來說,基本型別判斷值是否相等,引用型別判斷其指向的地址是否相等。看看下面的程式碼,兩種類似的程式碼邏輯,但是得到截然不用的結果。

0e8c6055f5692a05b3f236b8c580e50b.png

這個必須從原始碼中才能找到答案。Integer類中的valueOf()方法的原始碼如下:

95ea2e25e0c8bc4525cf9670e90d4b48.png

由於1屬於[-128, 127]集合範圍內,所以valueOf()每次都會取出同一個Integer物件,故第一個“==”判斷結果為true;而222不屬於[-128, 127]集合範圍內,所以valueOf()每次都會建立一個新的Integer物件,由於兩個新建立的物件的地址不一樣,故第一個“==”判斷結果為false。

原文連結:https://blog.csdn.net/xialei199023/article/details/63251295