1. 概述

在Java中,将int类型转换为String是一种非常常见的操作。本教程将介绍两个流行的转换方法:Integer类的toString()方法和String类的valueOf()方法。我们将探讨这两个方法的用法,并通过实例来更好地理解它们。

2. Integer.toString()方法

这个方法接受一个基本类型的整数int作为参数,返回一个表示指定整数的String对象。

让我们看看它的签名:

public static String toString(int i)

接下来,我们将通过传递有符号/无符号整数作为参数来看几个例子,以了解整数到字符串的转换过程:

@Test
public void whenValidIntIsPassed_thenShouldConvertToString() {
    assertEquals("11", Integer.toString(11)); 
    assertEquals("11", Integer.toString(+11)); 
    assertEquals("-11", Integer.toString(-11));
}

3. String.valueOf()方法

此方法同样接受基本类型的整数int作为参数,返回一个String对象。有趣的是,返回的字符串表示形式与Integer.toString(int i)方法返回的完全相同。这是因为它内部实际上使用了Integer.toString()方法。

让我们看看java.lang.String类中的内部实现:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

为了更好地理解,我们将通过传递有符号/无符号整数作为参数来查看一些例子,了解整数到字符串的转换过程:

@Test
public void whenValidIntIsPassed_thenShouldConvertToValidString() {
    assertEquals("11", String.valueOf(11)); 
    assertEquals("11", String.valueOf(+11));
    assertEquals("-11", String.valueOf(-11));
}

4. Integer.toString()String.valueOf()之间的差异

总结起来,这两个方法之间没有实际区别,但在编程时应注意以下几点以避免混淆。

当我们使用String.valueOf()方法时,调用栈中会有一个额外的调用,因为其内部使用了相同的Integer.toString()方法。

当将null对象传递给valueOf()方法时可能会引起混淆,因为将基本类型的int传递给valueOf()方法看起来相同,但实际上调用了不同的重载方法。

Integer.toString()如果传入的Integer对象为null,可能会抛出NullPointerException。而String.valueOf()不会抛出异常,因为它会调用String.valueOf(Object obj)方法并返回null。请注意,将int传递给String.valueOf(int i)永远不会是null,但由于存在String.valueOf(Object obj)方法,我们可能会对这两个重载方法产生混淆。

请通过以下示例理解这一点:

@Test(expected = NullPointerException.class)
public void whenNullIntegerObjectIsPassed_thenShouldThrowException() {
    Integer i = null; 
    System.out.println(String.valueOf(i)); 
    System.out.println(i.toString());
}

请注意,基本类型的int永远不会是null,我们在检查异常时会考虑这一点。

5. JVM内联方法对String.valueOf()方法的影响

如前所述,String.valueOf()方法涉及额外的调用。但是,JVM可以通过内联方法消除调用栈中的这个额外调用。

然而,这完全取决于JVM是否选择内联该方法。有关更多详细信息,请参阅我们的关于JVM内联方法的文章

6. 总结

在这篇文章中,我们学习了Integer.toString()String.valueOf()方法。我们还关注了一些编程时需要留意的点,以避免混淆。

如往常一样,本文的所有代码示例可在GitHub上找到。