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


88

之间有什么区别

Object foo = "something";
String bar = String.valueOf(foo);

Object foo = "something";
String bar = (String) foo;

17
呃,它们根本不一样……。
感知

Answers:


148

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

Object reallyAString = "foo";
String str = (String) reallyAString; // works.

当对象是其他对象时,它将不起作用:

Object notAString = new Integer(42);
String str = (String) notAString; // will throw a ClassCastException

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"

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


13
@AdamStelmaszczyk:我怀疑是否有任何相关之处。也许铸造速度稍快,但是其他方面的差异(空处理,以处理其他类型的能力)都只是显著比任何轻微的性能差异,有可能是更重要的。
Joachim Sauer

3
为了进一步推动这个问题,调用String.valueOf()和之间是否有显着区别obj.toString()?(我想到的第一个是obj.toString()如果obj为null则将通过异常。)
凯文(Kevin

3
@Kevin:对于引用类型(也称为“对象”),唯一的区别是null。如果您查看String.valueOf()JDK中的实现,您会发现它对非null引用所做的全部工作就是调用toString()
约阿希姆·绍尔

我一直认为@JoachimSauerString.valueOf()比演员更优雅。但是,如果String.valueOf()演员表所做的一切,以及更多,是否有任何理由为什么会选择使用演员表?为什么不弃用它?
Shahid M Zubair 2014年

1
@silver:的确,我简化了。String.valueOf((Object) null)将返回字符串“ null”。用文字调用它null会调用String#valueOf(char []),当您传入时,它实际上会抛出一个NPE null
Joachim Sauer 2015年

19

String.valueOf(foo)调用foo.toString()方法并将结果分配给bar。它为null,并输入安全操作。

铸造只会分配FOO,如果类型匹配。否则,表达式将抛出ClassCastException


5
+1对于解释String.valueOf(Object)调用Object.toString()
Ryan Amos


2

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


2

String.valueOf方法用于获取其参数对象的String表示形式。

(字符串)值将对象值转换为字符串。

您可以使用String.valueOf方法获取对象的String表示形式,而不必担心null引用。如果尝试将String强制转换为null引用,则将获得NullPointerException。


1
final Object obj = null;
final String strValOfObj = String.valueOf(obj);
final String strCastOfObj = (String) obj;
if (strValOfObj == null) System.out.println("strValOfObj is null");
if (strCastOfObj == null) System.out.println("strCastOfObj is null");

输出strCastOfObj is null



0

在String.valueOf();中 字符串作为工作类型广播在valueof()方法中传递的所有参数都将在String中转换,就像integer.string()仅将整数转换为字符串一样

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.