1. 概述

在使用 Java 时,操作字符串是一项基本任务。我们经常需要将其他数据类型转换为字符串。实现这一目标的两种常见方法是强制类型转换到字符串以及使用String.valueOf()方法。它们表面上看起来相似,但两者之间存在一些差异,可能影响代码的行为。

在这篇简短教程中,我们将讨论这两种方法之间的区别。

2. 强制转换到字符串与String.valueOf()方法

首先,看一个例子。假设我们将一个字符串值分配给一个类型为Object的变量:

Object obj = "Baeldung is awesome!";

如果我们想将obj转换为字符串,可以直接进行:

String castResult = (String) obj;
assertEquals("Baeldung is awesome!", castResult);

或者,我们可以使用标准库提供的String.valueOf()方法:

String valueOfResult = String.valueOf(obj);
assertEquals("Baeldung is awesome!", valueOfResult);

如我们所见,两种方法都能按预期工作。

尽管乍看之下两者相似,但实际上它们有一些显著的区别。接下来,让我们深入探讨。

3. 转换非字符串对象时

我们刚才将一个字符串值分配给了Object变量。强制转换到字符串和String.valueOf()方法都可以将obj转换为字符串实例。

现在,让我们将一些非字符串值分配给Object变量,看看它们是否仍然按预期工作。

首先,让我们测试直接将非字符串对象转换为字符串:

Object obj = 42;
assertThrows(ClassCastException.class, () -> {String castResult = (String) obj;});
 
Object obj2 = List.of("Baeldung", "is", "awesome");
assertThrows(ClassCastException.class, () -> {String castResult = (String) obj2;});

在这个例子中,我们将整数值(42)赋给了obj,而obj2持有字符串列表。正如演示的那样,当对象不是字符串类型时,直接强制转换到字符串会抛出ClassCastException。这很容易理解:因为String是最终类,只有当我们知道对象是Stringnull时,强制转换到String才是有效的。

接下来,让我们看看String.valueOf()方法是否会抛出相同的异常:

String valueOfResult = String.valueOf(obj);
assertEquals("42", valueOfResult);
 
valueOfResult = String.valueOf(obj2);
assertEquals("[Baeldung, is, awesome]", valueOfResult);

如我们所见,当我们传递objobj2String.valueOf()时,它不会抛出任何异常。相反,它将非字符串对象转换为字符串值。

接下来,让我们看看String.valueOf()的实现,以了解为什么会这样:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

实现确实很简单。**String.valueOf()方法调用输入对象的toString()方法。因此,无论obj的类型是什么,它总是返回一个字符串。**

此外,从String.valueOf()的实现来看,该方法包括了对null值的检查。那么,让我们来看看直接转换和String.valueOf()如何处理null值。

4. 处理null

首先,让我们尝试将null对象转换为字符串:

Object obj = null;
String castResult = (String) obj;
assertNull(castResult);

如示例所示,通过将null值转换为字符串,我们得到了null值。

由于我们已经看到了String.valueOf()方法的实现,测试结果并不令人意外:

String valueOfResult = String.valueOf(obj);
assertNotNull(valueOfResult);
assertEquals("null", valueOfResult);

与直接转换不同,String.valueOf()从不返回null如果我们传递null值给String.valueOf(),我们会得到字符串“null”。

5. 总结

在 Java 中,强制转换到字符串和使用String.valueOf()方法都能将非字符串数据类型转换为字符串值。在这篇文章中,我们探讨了它们之间的区别。

现在,让我们简要总结它们的关键差异:

  • 类型灵活性 - String.valueOf()接受任何类型的输入,并返回其字符串表示形式,而不会引发异常。相比之下,强制转换仅限于由String或其超类(如CharSequenceObject等)引用的String值,如果使用不当,会抛出ClassCastException
  • null处理 - String.valueOf()优雅地处理null值,将它们转换为字符串“null”。如果被转换的对象是null,强制转换到字符串会返回null
  • 可读性 - String.valueOf()明确表示其目的,使代码更易于理解。然而,将对象强制转换为字符串可能不太清晰,可能会被误认为是类型转换,而不是字符串转换。

因此,**String.valueOf()方法提供了更健壮的解决方案,用于将不同类型的数据转换为字符串。**

如往常一样,示例的完整源代码可以在GitHub上找到。