在這篇文章中,我們將討論 Integer 類別。讓我們考慮這些問題:
從實際意義上講,原語及其包裝類別有許多共同點。大多數操作的執行方式相同。然而,包裝類別具有許多基元所沒有的特徵。首先,有類別:當使用包裝類別時,我們使用物件。其次(接下來的一切都從第一點開始),這些物件可以為空。第三,包裝類別提供了許多常數和方法,使使用特定資料類型變得更加容易。在本文中,我們將仔細研究 Integer 類別的使用。
Integer類別是基本型別int的包裝類別。該類別包含一個 int 類型的欄位。作為一個包裝類,Integer 提供了各種處理 int 的方法,以及許多將 int 轉換為 String 以及將 String 轉換為 int 的方法。下面我們將看看與班級合作的各種範例。讓我們從創作開始。最常用(也是最容易使用)的是以下建立選項:
然而,儘管如此,您需要小心並記住 Integer 是一種引用資料類型,並且這種類型的變數可以為 null。在這種情況下(如果變數為 null),最好避免算術運算(以及 null 不是什麼好兆頭的任何其他運算)。這是一個例子:
讓我們透過運行以下程式碼來查看所有這些常數的值:
- 什麼是包裝類;
- 原語的自動打包/解包;
- Integer 類別及其方法和常數的操作。
原始類型的包裝類
大家知道,Java有多種資料型,可以分成兩大塊:- 原始;
- 參考。
- 整數 - byte、short、int、long;
- 浮點數(實數)- float、double;
- 邏輯資料類型 - 布林值;
- 字元資料類型 - char。
原始型 | 類包裝器 |
---|---|
位元組 | 位元組 |
短的 | 短的 |
整數 | 整數 |
長的 | 長的 |
漂浮 | 漂浮 |
雙倍的 | 雙倍的 |
布林值 | 布林值 |
字元 | 特點 |
整數_
Integer類別是基本型別int的包裝類別。該類別包含一個 int 類型的欄位。作為一個包裝類,Integer 提供了各種處理 int 的方法,以及許多將 int 轉換為 String 以及將 String 轉換為 int 的方法。下面我們將看看與班級合作的各種範例。讓我們從創作開始。最常用(也是最容易使用)的是以下建立選項:
Integer a = 3;
也就是說,這種情況下 Integer 變數的初始化與 int 變數的初始化類似。此外,可以使用 int 變數的值來初始化 Integer 變數:
int i = 5;
Integer x = i;
System.out.println(x); // 5
在上述情況下,自動打包是隱式發生的。我們將在下面詳細討論它。除了上面列出的初始化選項之外,還可以像其他物件一樣使用建構函式和 new 關鍵字建立 Integer 變數:
Integer x = new Integer(25);
System.out.println(x);
然而,寫入需要更長的時間,讀取也需要更長的時間,因此該選項是最不常見的。您可以使用 Integer 變數執行所有可以使用 int 變數執行的操作。他們可以:
折疊 |
|
減去 |
|
乘 |
|
劃分 |
|
增量 |
|
遞減 |
|
Integer a = null;
Integer b = a + 1; // Здесь мы упадем с "Exception in thread "main" java.lang.NullPointerException"
System.out.println(b);
大多數比較操作的執行方式與基本型別 int 相同:
Integer a = 1;
Integer b = 2;
System.out.println(a > b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a <= b);
輸出:
false
false
true
true
比較兩個整數變數的操作很突出。這裡的重點是Integer是一種引用資料型,它的變數儲存的是對值的引用,而不是值本身(物件)。執行以下程式碼片段時可以觀察到這一事實的表現:
Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
System.out.println(a == b); // true
System.out.println(a == c); // false
第一個相等的結果將為 true,第二個相等的結果將為 false。發生這種情況是因為在第一種情況下,我們比較儲存對相同物件的引用的兩個變數(“a”和“b”)。在第二種情況下,我們比較引用兩個不同物件的兩個變數(在建立變數「c」時,我們建立了一個新物件)。我們再舉一個有趣的例子:
Integer a = 1;
Integer b = 1;
Integer x = 2020;
Integer y = 2020;
System.out.println(a == b); // true
System.out.println(x == y); // false
可以看到,第一次比較的結果為 true,第二次比較的結果為 false。這都是關於快取的。所有在 -128 到 127 範圍內的整數(這些值可以自訂)都會被快取。因此,當我們建立一個新變數並為其分配 -128 到 127 之間的整數值時,我們並不是在建立一個新對象,而是為該變數分配對快取中已建立對象的參考。現在,知道了這個事實,上面的例子就顯得不再那麼神祕了。變數 a 和 b 引用同一個物件 - 來自快取的物件。並且在變數x和y的初始化過程中,我們每次都創建了一個新對象,並且這些變數儲存了對不同對象的引用。並且如您所知,==運算子比較變數的值,而引用變數的值是引用。要準確檢查兩個 Integer 變數之間的相等性,必須使用 equals 方法(無論聽起來多麼微不足道)。讓我們重寫上面的例子:
Integer a = 1;
Integer b = 1;
Integer x = 2020;
Integer y = 2020;
System.out.println(a.equals(b)); // true
System.out.println(x.equals(y)); // true
自動打包和解包整數
什麼是自動裝箱和拆箱?在建立新的整數變數時,我們使用以下結構:Integer a = 2020;
這樣我們就建立了一個新對象,而無需使用 new 鍵運算子。這要歸功於原始型別 int 的自動打包機制。將原始 int 變數指派給 Integer 引用變數的值時,會發生相反的過程:
Integer a = 2020;
int x = a;
在這種情況下,我們似乎將引用(即物件的引用是變數“a”的值)分配給了一個原始變數。但事實上,由於自動拆包機制,值 2020 被寫入變數「x」中,自動打包/拆包是 Java 中非常常見的現象。通常它會自行發生,有時甚至在程式設計師不知情的情況下發生。但你仍然需要了解這個現象。我們在 Javarush 上有一篇關於這個主題的有趣文章。
整數類常數
Integer 類別提供了用於處理整數的各種常數和方法。在本節中,我們將在實踐中仔細研究其中的一些。讓我們從常數開始。下表顯示了所有類別常數:科斯坦塔 | 描述 |
---|---|
尺寸 | int型別在兩位數制中所佔的位數 |
位元組數 | int型別佔用的兩位數係統中的位元組數 |
MAX_VALUE | int型別可以容納的最大值 |
MIN_VALUE | int型別可以容納的最小值 |
類型 | 從 int 類型傳回 Class 類型的對象 |
public static void main(String[] args) {
System.out.println(Integer.SIZE);
System.out.println(Integer.BYTES);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.TYPE);
}
結果,我們得到以下輸出:
32
4
2147483647
-2147483648
int
Integer 類別的方法
現在讓我們快速瀏覽一下 Integer 類別最常用的方法。因此,「頂級」方法以從字串轉換數字或從數字轉換字串的方法為首。讓我們從將字串轉換為數字開始。parseInt方法用於這些目的,其簽名如下:-
static int parseInt(String s)
int i = Integer.parseInt("10");
System.out.println(i); // 10
如果無法進行轉換(例如,我們將一個單字傳遞給 parseInt 方法),則會拋出 NumberFormatException。parseInt(String s) 方法有一個重載的同級方法:
-
static int parseInt(String s, int radix)
System.out.println(Integer.parseInt("0011", 2)); // 3
System.out.println(Integer.parseInt("10", 8)); // 8
System.out.println(Integer.parseInt("F", 16)); // 15
parseInt 方法傳回原始資料類型 int。這些方法有一個類似的方法 - valueOf方法。此方法的一些變體只是在內部呼叫 parseInt。與 parseInt 的區別在於 valueOf 的結果將是 Integer,而不是 int。下面讓我們考慮一下此方法的所有選項以及其工作原理的範例:
- static Integer valueOf(int i) - 傳回值為 i 的 Integer;
- static Integer valueOf(String s) - 與 parseInt(String s) 類似,但結果將為 Integer;
- static Integer valueOf(String s, int radix) - 與 parseInt(String s, int radix) 類似,但結果將是 Integer。
int a = 5;
Integer x = Integer.valueOf(a);
Integer y = Integer.valueOf("20");
Integer z = Integer.valueOf("20", 8);
System.out.println(x); // 5
System.out.println(y); // 20
System.out.println(z); // 16
我們研究了允許將 String 轉換為 int/Integer 的方法。相反的過程是使用toString方法實現的。您可以在任何 Integer 物件上呼叫 toString 方法並取得其字串表示形式:
Integer x = 5;
System.out.println(x.toString()); // 5
但是,由於 toString 方法通常在物件上隱含呼叫(例如,將物件傳送到控制台進行列印時),因此開發人員很少明確使用該方法。還有一個靜態方法 toString,它接受一個 int 參數並將其轉換為字串表示形式。例如:
System.out.println(Integer.toString(5)); // 5
但是,與非靜態 toString 方法一樣,明確使用靜態方法的情況很少見。更有趣的是靜態方法 toString,它帶有 2 個整數參數:
- static String toString(int i, int radix) - 將 i 轉換為基數系統中的字串表示形式。
System.out.println(Integer.toString(5, 2)); // 101
Integer 類別有幾種方法用於尋找兩個數字的最大值/最小值:
- static int max(int a, int b) 將傳回傳遞的變數中的最大值;
- static int min(int a, int b) 將傳回傳遞的變數中的最小值。
int x = 4;
int y = 40;
System.out.println(Integer.max(x,y)); // 40
System.out.println(Integer.min(x,y)); // 4
結論
在本文中,我們研究了 Integer 類別。我們討論了這是一個什麼樣的類別以及什麼是包裝類別。我們從實踐的角度來看這門課。我們研究了算術運算的範例,包括比較運算。我們研究了比較兩個整數變數的複雜性,並研究了快取物件的概念。我們也提到了原始資料類型的自動打包/解包現象。此外,我們還設法查看了 Integer 類別的一些方法以及一些常數。他們給出了將數字從一種數字系統轉換為另一種數字系統的範例。家庭作業
-
研究一下 Integer 類別還有哪些其他方法(您可以在官方文件的網站上研究它們),在評論中寫下您認為您研究過的哪種方法(不包括文章中給出的方法)最有用(將是您最常使用的)。並提供你的觀點的理由。
PS 這裡沒有正確答案,但這個活動可以讓你更能學習課程。
-
解決一個簡單的小問題來鞏固材料。
我們有兩個數字:
1100001001 - 二進制數係統
33332 - 五進制數係統有必要僅使用 Integer 類別的方法來確定兩個給定數字之間的最大值,然後顯示三進位數字系統中最大值和最小值之間的差異。
-
將最大可能的整數值轉換為八進制數字系統並顯示結果數字中的位數(以程式設計方式計算數字)。
GO TO FULL VERSION