概述

在Java中,将字符串转换为整数(intInteger)是一项非常常见的操作。本教程将介绍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)

除了intInteger的转换外,此方法还可以接受一个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上找到。