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上找到。