10分鐘講清int 和 Integer 的區別

2023-06-25 12:02:31

其實在Java程式設計中,int和Integer都是非常常用的資料型別,但它們之間存在一些關鍵的區別,特別是在物件導向程式設計中。所以接下來,就讓我們一起來探討下關於int和Integer的區別這個問題吧。

1.  int和Integer的定義

int是Java中的一種基本資料型別,用於表示整數。它是Java語言中最常用的資料型別之一,可以直接進行數值運算,無需通過封裝類進行轉換。

Integer是Java中的一個封裝類,用於表示整數。它是int的封裝類,可以將int型別的資料轉換為Integer型別的資料。Integer類提供了許多操作整數的方法,使得整數的操作更加方便和靈活。

2.  int和Integer的區別

2.1 資料型別

int是Java中的基本資料型別,而Integer是int的封裝類。int型別的資料直接儲存在記憶體中的棧中,而Integer型別的資料則儲存在堆中的物件中。

2.2  可空性

2.2.1 int的可空性

int是Java的基本資料型別之一,它是一種原始型別,因此它不具有可空性。這意味著int型別的變數不能為null。如果你試圖將一個int變數賦值為null,那麼編譯器將會報錯哦。

int i = null; // 編譯錯誤:不相容的型別:無法轉換為int

因此,在使用int型別的變數時,你不需要考慮它的可空性。這也是為什麼在Java中,使用int型別的變數比使用Integer型別的變數更加高效的原因之一。

2.2.2 Integer的可空性

相比之下,Integer是一種包裝型別,它可以為null。這意味著你可以將一個Integer型別的變數賦值為null。

Integer i = null;

然而,當你使用一個可能為null的Integer型別的變數時,你需要小心。如果你嘗試在一個為null的Integer型別的變數上呼叫方法,程式將會丟擲NullPointerException異常。

Integer i = null;
int j = i.intValue(); // 丟擲NullPointerException

為了避免這種情況,你可以使用Java 8中引入的Optional類。Optional類是一個容器物件,它可能包含null或非null的值。通過使用Optional類,你可以安全地使用可能為null的Integer型別的變數。

Optional optionalInteger = Optional.ofNullable(i);
int j = optionalInteger.orElse(0);

在上面的程式碼中,我們使用Optional.ofNullable()方法將可能為null的Integer型別的變數包裝成一個Optional物件。然後,我們使用orElse()方法指定了當optionalInteger物件的值為null時應該返回的預設值。

通過上述分析的int和Integer的可空性。我們簡單總結下:int是一種原始型別,它不具有可空性,而Integer是一種包裝型別,它可以為null。當你使用可能為null的Integer型別的變數時,你需要小心,並使用Optional類來避免NullPointerException異常的丟擲。

2.3 效率和效能

int的效率和效能比Integer要高。因為int型別的資料直接儲存在棧中,不需要進行堆記憶體的分配和垃圾回收。而Integer型別的資料需要進行堆記憶體的分配和垃圾回收,效率和效能相對較低。

2.3.1 int和Integer的效率和效能比較

由於int是一個原始型別,所以它的操作速度比Integer快。因為在Java虛擬機器器中,操作原始型別的指令比操作物件型別的指令要快得多。另外,由於Integer是一個物件型別,所以它需要更多的記憶體空間來儲存它的值和相關的方法。這使得Integer的效率比int低。

下面是一個簡單的程式碼案例,用來比較int和Integer的效率和效能:

public class IntVsInteger {
    public static void main(String[] args) {
        int a = 1;
        Integer b = 1;

        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            a++;
        }
        long end = System.currentTimeMillis();
        System.out.println("int操作耗時:" + (end - start) + "ms");

        start = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            b++;
        }
        end = System.currentTimeMillis();
        System.out.println("Integer操作耗時:" + (end - start) + "ms");
    }
}

在上面的程式碼中,我們分別使用int和Integer進行100000000次自增操作,並記錄每次操作的耗時。執行結果如下:

int操作耗時:24ms
Integer操作耗時:1023ms

從上面的結果可以看出,int的操作速度確實比Integer快得多。而且在這個簡單的案例中,int的操作耗時也只有Integer的1/40。

所以,在Java程式設計中,大家應該儘可能地使用原始型別來提高程式的效率和效能。只有在需要使用物件型別的時候,才應該使用其對應的包裝類。在實際開發中,我們應該根據具體情況來選擇使用int還是Integer,以達到最優的效率和效能哦。

2.4 自動裝箱和拆箱

Java中的自動裝箱和拆箱是指在需要Integer型別的物件時,系統會自動將int型別的資料轉換為Integer型別的物件。在需要int型別的資料時,系統會自動將Integer型別的物件轉換為int型別的資料。這個功能可以使得程式碼更加簡潔,但是也會帶來一些效能的損失。

2.4.1 自動裝箱

自動裝箱是指將基本資料型別轉換為對應的包裝類型別的過程。在Java中,基本資料型別可以自動轉換為包裝類型別,而無需進行顯式的型別轉換。

int num = 10;
Integer integerNum = num; // 自動裝箱

在上面的程式碼中,將int型別的變數num賦值給Integer型別的變數integerNum時,發生了自動裝箱操作。

2.4.2 自動拆箱

自動拆箱是指將包裝類型別轉換為對應的基本資料型別的過程。在Java中,包裝類型別可以自動轉換為基本資料型別,而無需進行顯式的型別轉換。

Integer integerNum = 10;
int num = integerNum; // 自動拆箱

在上面的程式碼中,將Integer型別的變數integerNum賦值給int型別的變數num時,發生了自動拆箱操作。

2.4.3 注意事項

在進行自動裝箱和拆箱操作時,需要注意以下幾點:

● 自動裝箱和拆箱操作會影響程式的效能,因此在效能要求較高的場景下,應儘量避免使用自動裝箱和拆箱操作。

● 在進行自動拆箱操作時,如果包裝類物件為null,則會丟擲NullPointerException異常。

● 在進行自動拆箱操作時,如果包裝類物件與基本資料型別不匹配,則會丟擲ClassCastException異常。

Integer integerNum = null;
int num = integerNum; // 丟擲NullPointerException異常

Integer integerNum = 10;
double doubleNum = integerNum; // 丟擲ClassCastException異常

上述就是關於自動裝箱和自動拆解的描述,當然,這裡還是要嘮叨一句:在實際開發中,大家還是需要根據具體場景選擇使用自動裝箱和拆箱操作或者手動進行型別轉換,以便提高程式的效能和穩定性哦。

3.  int和Integer的比較

在Java中,int和Integer之間的比較分為兩種情況:基本型別之間的比較和包裝型別之間的比較。

3.1 基本型別之間的比較

在比較兩個基本型別的值時,可以使用「==」和「!=」運運算元。例如:

int a = 10;
int b = 10;
if(a == b){
    System.out.println("a等於b");
}

在這個例子中,a和b的值都是10,因此它們是相等的。如果我們將其中一個變數的值改為其他值,那麼它們將不相等。例如:

int a = 10;
int b = 20;
if(a != b){
    System.out.println("a不等於b");
}

在這個例子中,a和b的值不相等,因此它們是不相等的。

3.2 包裝型別之間的比較

在比較兩個包裝型別的值時,不能使用「==」和「!=」運運算元。因為這些運運算元只能比較兩個物件的參照是否相等,而不是它們的值是否相等。例如:

Integer a = new Integer(10);
Integer b = new Integer(10);
if(a == b){
    System.out.println("a等於b");
}

在這個例子中,儘管a和b的值相等,但是它們的參照不相等,因此比較結果為false。如果我們使用equals()方法來比較它們的值是否相等,那麼比較結果為true。例如:

Integer a = new Integer(10);
Integer b = new Integer(10);
if(a.equals(b)){
    System.out.println("a等於b");
}

在這個例子中,a和b的值相等,因此比較結果為true。

另外,如果我們將一個基本型別值賦給一個包裝型別變數時,Java會自動將基本型別值裝箱為包裝型別。例如:

Integer a = 10;

在這個例子中,Java會自動將10裝箱為Integer型別,並將其賦給變數a。

3.3 小結

● int是Java的基本資料型別,而Integer是int的包裝類。

● 在比較兩個基本型別的值時,可以使用「==」和「!=」運運算元。

● 在比較兩個包裝型別的值時,不能使用「==」和「!=」運運算元,而是應該使用equals()方法來比較它們的值是否相等。

所以,大家在實際開發中,我們應該根據實際情況選擇使用int或Integer。如果需要對整數進行基本操作,例如加減乘除等,那麼建議使用int型別。如果需要對整數進行一些高階操作,例如字串轉換等,那麼建議使用Integer型別。

4.  為什麼要有包裝類?

帶大家瞭解完畢關於int和Integer的區別之後呢,就讓我們來看看為什麼要有包裝類吧。儘管int是Java中的基本資料型別,但在實際程式設計中,我們需要使用許多與整數相關的功能和方法。因此,Java提供了Integer這樣的包裝類,以便我們能夠更方便地進行整數計算和處理。

例如,在我們的公司專案中,我們需要計算使用者購買某種商品的總成本。假設每個商品的價格都是一個整數,購買數量也是一個整數。我們可以使用int型別來表示這些值,但是如果我們想要計算總成本,我們必須使用許多int變數,並手動計算它們的總和。這樣做不僅繁瑣而且容易出錯。

相反,我們可以使用Integer包裝類來表示商品價格和數量。這樣,我們就可以使用Integer類提供的方法來輕鬆地計算總成本,而不必手動計算。例如,我們可以使用intValue()方法將Integer物件轉換為int,然後使用乘法運運算元和加法運運算元來計算總成本。

Integer price = 10;
Integer quantity = 5;
int totalCost = price.intValue() * quantity.intValue();
System.out.println("Total Cost: " + totalCost);

在這個例子中,我們使用了Integer包裝類來表示商品價格和數量,然後使用intValue()方法將它們轉換為int,最後計算總成本。這樣做的原因的,其實就是為了使得我們的程式碼更加簡潔和易於理解。

上述就是關於為什麼要有包裝類的簡單描述,希望這個案例能夠幫助大家更好的理解這個問題哦!

5.  總結

在本篇文章中,我們解釋了Java中int和Integer之間的差異,並結合一些程式碼案例進行了說明和分析。我們發現,int是基本資料型別,而Integer是一個包裝類,它提供了更多的功能和方法。我們還發現,使用Integer可以更方便地進行整數計算和處理,特別是在物件導向程式設計中。

總而言之,瞭解int和Integer之間的差異非常重要,因為它們經常出現在Java程式設計中。希望本篇文章對大家有所幫助,同時也可以幫助大家更好地理解和應用這些概念。