Java中Integer.toString()与String.valueOf()的比较 | Baeldung
Java中Integer.toString()与String.valueOf()的比较 | Baeldung
正如我们所知,在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类的内部实现:
/**
* 返回int参数的字符串表示。
* `<p>`
* 表示与一个参数的{@code Integer.toString}方法返回的完全相同。
*
* @param i 一个{@code int}。
* @return int参数的字符串表示。
* @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上找到。头文件中的日期和类别、标签信息需要从网页中获取,但当前提供的网页内容中并没有这些信息。因此,我将使用网页中实际存在的信息来完成翻译。以下是翻译的剩余部分:
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。请注意,传递给String.valueOf(int i)的原始int永远不会是null,但由于存在另一个方法String.valueOf(Object obj),我们可能会在这两个重载方法之间混淆。
让我们通过以下示例来理解最后一点:
@Test(expected = NullPointerException.class)
public void whenNullIntegerObjectIsPassed_thenShouldThrowException() {
Integer i = null;
System.out.println(String.valueOf(i)); // 这里会调用String.valueOf(Object obj)并返回"null"
System.out.println(i.toString()); // 这里会抛出NullPointerException,因为i是null
}
请注意,原始int永远不会是null,我们在这里检查它,以防下面的方法抛出异常。
5. JVM方法内联对String.valueOf()方法的影响
正如我们之前讨论的,String.valueOf()方法涉及一个额外的调用。但是,JVM可以通过方法内联来消除调用栈中的这个额外调用。
但这完全取决于JVM是否选择内联该方法。有关更详细的描述,请访问我们关于JVM中方法内联的文章。
6. 结论
在这篇文章中,我们学习了Integer.toString()和String.valueOf()方法。我们还看了一我们应该集中注意力以避免编程时混淆的要点。
如往常一样,这篇文章的完整代码示例可以在GitHub上找到。
OK