1. 程式人生 > 程式設計 >Java基本型別和包裝型別的區別

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 類及其子類——基本型別是個特例。

基本型別比包裝型別更高效

基本型別在棧中直接儲存的具體數值,而包裝型別則儲存的是堆中的引用。

Java基本型別和包裝型別的區別

很顯然,相比較於基本型別而言,包裝型別需要佔用更多的記憶體空間。假如沒有基本型別的話,對於數值這類經常使用到的資料來說,每次都要通過 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基本型別和包裝型別的資料請關注我們其它相關文章!