1. 简介
在本文中,我们将对比一下 Java 中使用 (String)
类型强转与调用 toString()
方法的区别。我们会简要回顾这两种语法,并通过示例说明它们各自的适用场景。最后,我们也会给出哪种方式更优的建议。
2. (String)
类型强转 与 toString()
方法
先快速回顾一下基础知识:
使用
(String)
是典型的 类型强转语法,这在 Java 中用于将一个对象强制转换为String
类型。String str = (String) object;
而
toString()
方法是Object
类中的一个方法,所有的 Java 类都继承自Object
,因此都可以调用toString()
方法来获取该对象的字符串表示形式:String str = object.toString();
接下来,我们通过一些具体示例来深入理解两者的使用场景及注意事项。
3. (String)
vs toString()
假设我们有一个 Object
类型变量,现在需要将其转换为 String
类型,那么应该选择哪一种方式?
⚠️ 注意:以下工具方法仅用于演示目的,在实际开发中我们通常不会这样封装。
3.1 使用 (String)
强转
我们首先定义一个简单的工具方法,尝试将 Object
强转为 String
:
public static String castToString(Object object) {
if (object instanceof String) {
return (String) object;
}
return null;
}
✅ 优点:如果确认变量就是 String
实例,这种方式效率更高。
❌ 缺点:如果不是 String
类型,则会抛出 ClassCastException
异常:
@Test(expected = ClassCastException.class)
public void givenIntegerObject_whenCastToObjectAndString_thenCastClassException() {
Integer input = 1234;
Object obj = input;
String str = (String) obj; // 抛出异常
}
⚠️ 特别注意:这种操作对 null
是安全的。即使传入的是 null
,也不会报错:
@Test
public void givenNullInteger_whenCastToObjectAndString_thenSameAndNoException() {
Integer input = null;
Object obj = input;
String str = (String) obj;
assertEquals(obj, str);
assertEquals(str, input);
assertSame(input, str);
}
3.2 使用 toString()
方法
我们再来看使用 toString()
的方式:
public static String getStringRepresentation(Object object) {
if (object != null) {
return object.toString();
}
return null;
}
✅ 优点:不需要关心对象类型,任何非 null
对象都可以调用。
❌ 缺点:如果对象为 null
,会抛出空指针异常(NPE):
@Test(expected = NullPointerException.class)
public void givenNullInteger_whenToString_thenNullPointerException() {
Integer input = null;
String str = input.toString(); // 抛出 NPE
}
另外,对于已经是 String
类型的对象,调用 toString()
会返回自身:
@Test
public void givenString_whenToString_thenSame() {
String str = "baeldung";
assertEquals("baeldung", str.toString());
assertSame(str, str.toString());
}
3.3 应该如何选择?
✅ 如果你知道变量就是 String
类型,使用 (String)
更高效:
@Test
public void givenString_whenCastToObject_thenCastToStringReturnsSame() {
String input = "baeldung";
Object obj = input;
assertSame(input, StringCastUtils.castToString(obj));
}
⚠️ 但要记住:永远不要把 String
当成 Object
来传递,这往往是代码设计有问题的信号。
✅ 如果你处理的是其他类型的对象,那就必须显式调用 toString()
方法。注意其返回值取决于类的具体实现:
@Test
public void givenIntegerNotNull_whenCastToObject_thenGetToStringReturnsString() {
Integer input = 1234;
Object obj = input;
assertEquals("1234", StringCastUtils.getStringRepresentation(obj));
assertNotSame("1234", StringCastUtils.getStringRepresentation(obj));
}
4. 总结
在这篇文章中,我们比较了两种获取字符串的方式:(String)
强转 和 toString()
方法。通过示例可以看出:
- 当明确知道变量是
String
类型时,使用(String)
更直接、性能更好; - 其他情况下,推荐使用
toString()
,但要注意判空; - 不要把
String
作为Object
传来传去,这样容易埋坑。
📌 最后提醒:完整源码可从 GitHub 获取: https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-string-operations-3