Java基本型別和包裝型別的區別
包裝型別可以為 null,而基本型別不可以
別小看這一點區別,它使得包裝型別可以應用於 POJO 中,而基本型別則不行。
POJO 是什麼呢?這裡稍微說明一下。
POJO 的英文全稱是 Plain Ordinary Java Object,翻譯一下就是,簡單無規則的 Java 物件,只有屬性欄位以及 setter 和 getter 方法,示例如下。
class Writer { private Integer age; private String name; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
和 POJO 類似的,還有資料傳輸物件 DTO(Data Transfer Object,泛指用於展示層與服務層之間的資料傳輸物件)、檢視物件 VO(View Object,把某個頁面的資料封裝起來)、持久化物件 PO(Persistant Object,可以看成是與資料庫中的表對映的 Java 物件)。
那為什麼 POJO 的屬性必須要用包裝型別呢? 資料庫的查詢結果可能是 null,如果使用基本型別的話,因為要自動拆箱(將包裝型別轉為基本型別,比如說把 Integer 物件轉換成 int 值),就會丟擲 NullPointerException 的異常。
包裝型別可用於泛型,而基本型別不可以
泛型不能使用基本型別,因為使用基本型別時會編譯出錯。
List<int> list = new ArrayList<>(); // 提示 Syntax error,insert "Dimensions" to complete ReferenceType List<Integer> list = new ArrayList<>();
為什麼呢?因為泛型在編譯時會進行型別擦除,最後只保留原始型別,而原始型別只能是 Object 類及其子類——基本型別是個特例。
基本型別比包裝型別更高效
基本型別在棧中直接儲存的具體數值,而包裝型別則儲存的是堆中的引用。
很顯然,相比較於基本型別而言,包裝型別需要佔用更多的記憶體空間。假如沒有基本型別的話,對於數值這類經常使用到的資料來說,每次都要通過 new 一個包裝型別就顯得非常笨重。
兩個包裝型別的值可以相同,但卻不相等
兩個包裝型別的值可以相同,但卻不相等——這句話怎麼理解呢?來看一段程式碼就明明白白了。
Integer chenmo = new Integer(10); Integer wanger = new Integer(10); System.out.println(chenmo == wanger); // false System.out.println(chenmo.equals(wanger )); // true
兩個包裝型別在使用“”進行判斷的時候,判斷的是其指向的地址是否相等。chenmo 和 wanger 兩個變數使用了 new 關鍵字,導致它們在“”的時候輸出了 false。
而 chenmo.equals(wanger) 的輸出結果為 true,是因為 equals 方法內部比較的是兩個 int 值是否相等。原始碼如下。
private final int value; public int intValue() { return value; } public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
雖然 chenmo 和 wanger 的值都是 10,但他們並不相等。換句話說就是:將“==”操作符應用於包裝型別比較的時候,其結果很可能會和預期的不符。
以上就是Java基本型別和包裝型別的區別的詳細內容,更多關於Java基本型別和包裝型別的資料請關注我們其它相關文章!