Java中parseInt()和valueOf()的區別
一、概述
眾所周知,將數字String
轉換為int
或Integer
是 Java 中非常常見的操作。
在本教程中,我們將通過java.lang.Integer
類的兩個非常流行的static
方法parseInt()
和valueOf()
來幫助我們進行這種轉換。此外,我們還將通過簡單的示例了解這兩種方法之間的一些區別。
2. parseInt()
方法
java.lang.Integer
類提供了parseInt()
方法的三種變體。讓我們看看他們中的每一個。
2.1。將String
轉換為整數
*parseInt()
的第一個變體接受String
作為參數並返回原始數據類型int.
**當它無法將String
轉換為整數時,它會拋出NumberFormatException* 。
讓我們看看它的簽名:
public static int parseInt(String s) throws NumberFormatException
現在,我們將看到一些示例,其中我們將有符號/無符號數字字符串作為參數傳遞給它,以了解從字符串到整數的解析是如何發生的:
@Test
public void whenValidNumericStringIsPassed_thenShouldConvertToPrimitiveInt() {
assertEquals(11, Integer.parseInt("11"));
assertEquals(11, Integer.parseInt("+11"));
assertEquals(-11, Integer.parseInt("-11"));
}
2.2.指定基數
parseInt()
方法的第二個變體接受String
和int
作為參數並返回原始數據類型int.
**就像我們看到的第一個變體一樣,當它無法將String
轉換為整數時,*它也會拋出NumberFormatException* :
public static int parseInt(String s, int radix) throws NumberFormatException
默認情況下, parseInt()
方法假定給定的String
是一個以 10 為底的整數。這裡,參數radix
是用於字符串到整數轉換的基數或基數。
為了更好地理解這一點,讓我們看幾個例子,我們將一個字符串與radix
參數一起傳遞給parseInt()
:
@Test
public void whenValidNumericStringWithRadixIsPassed_thenShouldConvertToPrimitiveInt() {
assertEquals(17, Integer.parseInt("11", 16));
assertEquals(10, Integer.parseInt("A", 16));
assertEquals(7, Integer.parseInt("7", 8));
}
現在,讓我們了解如何使用基數進行字符串轉換。例如,在基數為 13 的數字系統中,一串數字(如 398)表示十進制數(基數/基數為 10)632。換句話說,在這種情況下,計算方式如下 - 3 × 13 2 + 9 × 13 1 + 8 × 13 0 = 632。
同樣,在上面的示例中, Integer.parseInt(“11”, 16)
返回 17,計算結果為 1 × 16 1 + 1 × 16 0 = 17。
2.3.將子字符串轉換為整數
最後, parseInt()
方法的第三個變體接受一個CharSequence,
子字符串的兩個整數beginIndex
和endIndex
,以及另一個整數radix
作為參數。如果傳遞了任何無效字符串,則拋出NumberFormatException:
public static int parseInt(CharSequence s, int beginIndex, int endIndex, int radix) throws NumberFormatException
JDK 9 在Integer
類中引入了這個static
方法。現在,讓我們看看它的實際效果:
@Test
public void whenValidNumericStringWithRadixAndSubstringIsPassed_thenShouldConvertToPrimitiveInt() {
assertEquals(5, Integer.parseInt("100101", 3, 6, 2));
assertEquals(101, Integer.parseInt("100101", 3, 6, 10));
}
讓我們了解如何將子字符串轉換為具有給定基數的整數。這裡,string 是“100101”, beginIndex
和endIndex
分別是 3 和 6。因此,子串是“101”。對於expectedNumber1
,傳遞的基數是 2,這意味著它是二進制的。因此,子串“101”被轉換為整數5。此外,對於expectedNumber2,
傳遞的基數是10,這意味著它是十進制的。因此,子字符串“101”被轉換為整數 101。
此外,我們可以看到Integer.parseInt()
在傳遞任何無效字符串時拋出NumberFormatException
:
@Test(expected = NumberFormatException.class)
public void whenInValidNumericStringIsPassed_thenShouldThrowNumberFormatException(){
int number = Integer.parseInt("abcd");
}
3. valueOf()
方法
接下來我們看一下java.lang.Integer.
類提供的valueOf()
方法的三種變體。
3.1。將String
轉換為Integer
valueOf()
方法的第一個變體接受String
作為參數並返回包裝類Integer.
如果傳遞了任何非數字字符串,則會拋出NumberFormatException
:
public static Integer valueOf(String s) throws NumberFormatException
有趣的是,它在實現中使用了parseInt(String s, int radix)
。
接下來,讓我們看幾個從有符號/無符號數字字符串到整數的轉換示例:
@Test
public void whenValidNumericStringIsPassed_thenShouldConvertToInteger() {
Integer expectedNumber = 11;
Integer expectedNegativeNumber = -11;
assertEquals(expectedNumber, Integer.valueOf("11"));
assertEquals(expectedNumber, Integer.valueOf("+11"));
assertEquals(expectedNegativeNumber, Integer.valueOf("-11"));
}
3.2.將int
轉換為Integer
**valueOf()
的第二個變體接受一個int
作為參數並返回包裝類Integer.
**此外,如果將任何其他數據類型(例如float
)傳遞給它,它也會生成編譯時錯誤.
這是它的簽名:
public static Integer valueOf(int i)
除了int
到Integer
的轉換,這個方法還可以接受一個char
作為參數並返回它的 Unicode 值。
為了進一步理解這一點,讓我們看幾個例子:
@Test
public void whenNumberIsPassed_thenShouldConvertToInteger() {
Integer expectedNumber = 11;
Integer expectedNegativeNumber = -11;
Integer expectedUnicodeValue = 65;
assertEquals(expectedNumber, Integer.valueOf(11));
assertEquals(expectedNumber, Integer.valueOf(+11));
assertEquals(expectedNegativeNumber, Integer.valueOf(-11));
assertEquals(expectedUnicodeValue, Integer.valueOf('A'));
}
3.3.指定基數
valueOf()
的第三個變體接受String
和int
作為參數並返回包裝類**Integer.**
此外,像我們看到的所有其他變體一樣,當它無法將給定字符串轉換為Integer
類型時,它也會拋出*NumberFormatException*
:
public static Integer valueOf(String s, int radix) throws NumberFormatException
此方法還在其實現中使用parseInt(String s, int radix)
。
默認情況下, valueOf
()
方法假定給定的String
表示一個以 10 為底的整數。此外,此方法接受另一個參數來更改默認 radix .
讓我們解析幾個String
對象:
@Test
public void whenValidNumericStringWithRadixIsPassed_thenShouldConvertToInetger() {
Integer expectedNumber1 = 17;
Integer expectedNumber2 = 10;
Integer expectedNumber3 = 7;
assertEquals(expectedNumber1, Integer.valueOf("11", 16));
assertEquals(expectedNumber2, Integer.valueOf("A", 16));
assertEquals(expectedNumber3, Integer.valueOf("7", 8));
}
4. parseInt()
和valueOf()
的區別
綜上所述,以下是valueOf
() 和parseInt()
方法的主要區別:
Integer.valueOf() |
Integer.parseInt() |
---|---|
它返回一個Integer 對象。 |
它返回一個原始int 。 |
此方法接受String 和int 作為參數。 |
此方法僅接受String 作為參數。 |
它在其方法實現中使用Integer.parseInt() 。 |
它不使用任何輔助方法將字符串解析為整數。 |
此方法接受一個字符作為參數並返回其 Unicode 值。 | 此方法在將字符作為參數傳遞時會產生不兼容的類型錯誤。 |
5. 結論
在本文中,我們了解了java.lang.Integer
類的parseInt()
和valueOf()
方法的不同實現。我們還研究了這兩種方法之間的差異。
與往常一樣,可以在 GitHub 上找到本文的完整代碼示例。