转换为String和String.valueOf之间的区别

Dro*_*out 84 java casting

有什么区别

Object foo = "something";
String bar = String.valueOf(foo);
Run Code Online (Sandbox Code Playgroud)

Object foo = "something";
String bar = (String) foo;
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 139

仅当对象实际是字符串时,仅转换为字符串:

Object reallyAString = "foo";
String str = (String) reallyAString; // works.
Run Code Online (Sandbox Code Playgroud)

当对象是其他东西时,它将无法工作:

Object notAString = new Integer(42);
String str = (String) notAString; // will throw a ClassCastException
Run Code Online (Sandbox Code Playgroud)

String.valueOf()但是会尝试将你传入的任何内容转换为String.它处理基元(42)和对象(new Integer(42)使用该对象toString()):

String str;
str = String.valueOf(new Integer(42)); // str will hold "42"
str = String.valueOf("foo"); // str will hold "foo"
Object nullValue = null;
str = String.valueOf(nullValue); // str will hold "null"
Run Code Online (Sandbox Code Playgroud)

特别注意最后一个例子:传递nullString.valueOf()将返回字符串"null".

  • @AdamStelmaszczyk:我怀疑有什么相关的.*也许*强制转换稍微快一些,但其他差异(空处理,处理其他类型的能力)只是*显着*比可能存在的任何微小性能差异更重要. (13认同)
  • 为了进一步推动这个问题,调用`String.valueOf()`和`obj.toString()`之间有什么显着的区别吗?(我想到的第一个问题是,如果`obj`为null,`obj.toString()`将通过异常.) (3认同)
  • @Kevin:对于引用类型(又名"对象"),唯一的区别是`null`会发生什么.如果你看一下JDK中`String.valueOf()`的实现,你会发现它对非空引用的所有操作都是调用`toString()`. (3认同)
  • @silver:确实,我过于简单化了。`String.valueOf((Object) null)` 将返回字符串“null”。使用文字 `null` 调用它将会调用 String#valueOf(char[]),当您传入 `null` 时,它实际上会抛出一个 NPE。 (2认同)

dar*_*jan 18

String.valueOf(foo)调用foo.toString()方法并将结果分配给.它是null并且类型安全操作.

如果类型匹配,则转换将仅向条形指定foo.否则,表达式将抛出一个.ClassCastException

  • +1用于解释`String.valueOf(Object)`调用`Object.toString()` (5认同)

tst*_*rms 5

强制转换意味着对象必须是 String 类型,但String.valueOf()也可以采用其他类型。


Sur*_*tta 5

在 的情况下两者都会生成相同的输出String

Casting如果提供的对象不是 a,则失败string.