概述
在Java中,将字符串转换为整数(int
或Integer
)是一项非常常见的操作。本教程将介绍java.lang.Integer
类中的两个常用静态方法:parseInt()
和valueOf()
,并通过实例理解它们之间的差异。
2. parseInt()
方法
java.lang.Integer
类提供了parseInt()
方法的三个变体。让我们逐一探讨。
2.1. 将字符串转换为int
parseInt()
的第一个变体接受一个字符串参数,并返回基本数据类型int
。如果无法将字符串转换为整数,它会抛出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. 指定基数
第二个变体接受一个字符串和一个整数作为参数,并返回基本数据类型int
。与第一个变体类似,如果无法转换字符串为整数,它也会抛出NumberFormatException
:
public static int parseInt(String s, int radix) throws NumberFormatException
默认情况下,parseInt()
方法假设给定的字符串是一个十进制整数。这里的参数radix
是用于字符串到整数转换的基数或基。
让我们通过一些例子来更好地理解这一点:
@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
、两个子字符串的起始和结束索引以及另一个整数作为参数。如果传递无效字符串,它会抛出NumberFormatException
:
public static int parseInt(CharSequence s, int beginIndex, int endIndex, int radix) throws NumberFormatException
从Java 9开始,Integer
类引入了这个静态方法。现在我们来看一个实例:
@Test
public void whenValidNumericStringWithRadixAndSubstringIsPassed_thenShouldConvertToPrimitiveInt() {
assertEquals(5, Integer.parseInt("100101", 3, 6, 2));
assertEquals(101, Integer.parseInt("100101", 3, 6, 10));
}
对于给定基数的子字符串转换为整数,例如字符串"100101",起始索引为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. 将字符串转换为Integer
valueOf()
的第一个变体接受一个字符串参数,并返回包装类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()
的第三个变体接受一个字符串和一个整数作为参数,并返回包装类Integer
。所有其他变体都存在的情况一样,如果无法将给定字符串转换为Integer
类型,它也会抛出NumberFormatException
:
public static Integer valueOf(String s, int radix) throws NumberFormatException
其实现同样使用了parseInt(String s, int radix)
。
默认情况下,valueOf()
方法假设给定的字符串代表一个十进制整数。此外,该方法还接受另一个参数来更改默认基数。
让我们解析一些字符串对象:
@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
。
valueOf()
接受字符串和整数作为参数,而parseInt()
只接受字符串。valueOf()
在其方法实现中使用Integer.parseInt()
。valueOf()
不使用任何辅助方法将字符串解析为整数。valueOf()
接受字符参数并返回其Unicode值,而parseInt()
在尝试将字符作为参数时会产生不兼容类型的错误。
5. 结论
本文介绍了java.lang.Integer
类中parseInt()
和valueOf()
方法的不同实现,以及它们之间的差异。完整的代码示例可以在GitHub上找到。