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


原始标题:Java (String) or .toString()? | Baeldung