在Java中,String.valueOf(Object)
和Object.toString()
之间有什么区别吗?
这些是否有特定的代码约定?
答案 0 :(得分:148)
根据the Java documentation,String.valueOf()
返回:
如果参数为
null
,则字符串等于"null"
;否则,返回obj.toString()
的值。
因此除了额外的方法调用之外,应该没有什么区别。
另外,对于Object#toString
,如果实例为null
,则会抛出NullPointerException
,因此可以说它不是安全。< / p>
public static void main(String args[]) {
String str = null;
System.out.println(String.valueOf(str)); // This will print a String equal to "null"
System.out.println(str.toString()); // This will throw a NullPointerException
}
答案 1 :(得分:15)
String.valueOf(Object)和Object.toString()之间的区别是:
1) 如果字符串为空,
String.valueOf(Object
)将打印null,而Object.toString()
将抛出空指针异常。
public static void main(String args[]){
String str = null;
System.out.println(String.valueOf(str)); // it will prints null
System.out.println(str.toString()); // it will throw NullPointer Exception
}
2)签名:
String类的valueOf()方法是静态的。而String类的toString()方法是非静态的。
string的valueOf()方法的签名或语法如下:
public **static** String valueOf(boolean b)
public **static** String valueOf(char c)
public **static** String valueOf(char[] c)
public **static** String valueOf(int i)
public **static** String valueOf(long l)
public **static** String valueOf(float f)
public **static** String valueOf(double d)
public **static** String valueOf(Object o)
字符串的toString()
方法的签名或语法如下:
public String toString()
答案 2 :(得分:11)
在Java中,String.valueOf(Object)和Object.toString()之间有什么区别吗?
是。
正如javadoc所解释的那样,String.valueOf(null)
将被视为一种特殊情况,而null.toString()
只会为您提供一份NPE。
这些是否有特定的代码约定?
没有。
使用哪种方式最适合您使用它的上下文的要求。 ( 格式是否适用于null
?)
注意:这不是代码约定。这只是常识编程。您的代码正确比遵循某些风格约定或最佳实践&#34;更重要。教条。
个人意见:
一些开发者获得了(IMO)的坏习惯&#34;捍卫&#34;反对空值。因此,您会看到许多空值测试,并将空值视为特殊情况。这个想法似乎阻止了NPE的发生。
我认为这是一个坏主意。特别是,我认为如果你找到null
时所做的就是努力做好事情,这是一个坏主意。 ......不考虑为什么会有null
。
一般情况下,最好避免null
首先出现在那里......除非null
在您的应用或API设计中具有非常特殊的含义。因此,不要避免使用大量防御性编码的NPE,最好让NPE发生,然后追踪并修复触发NPE的意外null
的来源。
那么这在这里是如何适用的?
好吧,如果你考虑一下,使用String.valueOf(obj)
可以成为一种“好”的方式。这是要避免的。如果上下文中obj
为null
意外,则最好使用obj.toString()
。
答案 3 :(得分:4)
String.valueOf(Object)
和Object.toString()
字面意思相同。
如果您查看String.valueOf(Object)的实现,您会发现String.valueOf(Object)
基本上只是对相应对象toString()
的空安全调用:< / p>
Returns the string representation of the Object argument.
Parameters:
obj an Object.
Returns:
if the argument is null, then a string equal to "null";
otherwise, the value of obj.toString() is returned.
See also:
Object.toString()
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
答案 4 :(得分:3)
其他答案已经提到了大多数,但是为了完整起见,我只是添加了它:
.toString()
,因为它们不是Object
类的实现,因此只能使用String.valueOf
。String.valueOf
会将给定的对象null
转换为字符串"null"
,而.toString()
将抛出NullPointerException
。String.valueOf
之类的默认情况下,编译器将使用String s = "" + (...);
。这就是为什么Object t = null; String s = "" + t;
将导致字符串"null"
而不是NPE的原因。StringBuilder.append
,而不是String.valueOf
。因此,请忽略我在这里说的话。除了这些以外,实际上是一个用例,其中String.valueOf
和.toString()
具有不同的结果:
假设我们有一个通用方法,如下所示:
public static <T> T test(){
String str = "test";
return (T) str;
}
我们将使用Integer
这样的Main.<Integer>test()
类型来调用它。
当我们使用String.valueOf
创建字符串时,它可以正常工作:
String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);
这会将test
输出到STDOUT。
但是对于.toString()
,它将不起作用:
String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);
这将导致以下错误:
java.lang.ClassCastException
:类java.lang.String
无法转换为类java.lang.Integer
关于原因,我可以参考this separated question and its answers。简而言之:
.toString()
时,它将首先编译并评估对象,将导致对T
的强制转换(在这种情况下为String
至Integer
的强制转换)在ClassCastException
中。String.valueOf
时,它将在编译过程中将通用T
视为Object
,甚至不关心它是Integer
。因此它将Object
转换为Object
(编译器将忽略)。然后它将使用String.valueOf(Object)
,产生预期的String
。因此,即使String.valueOf(Object)
将在内部对参数执行.toString()
,我们也已经跳过了强制转换并将其视为Object
,因此我们避免了{{1} }随ClassCastException
的使用而发生。只是在这里值得一提的是.toString()
和String.valueOf
之间的其他区别。
答案 5 :(得分:2)
最重要的区别是它们处理null String引用的方式。
String str = null;
System.out.println("String.valueOf gives : " + String.valueOf(str));//Prints null
System.out.println("String.toString gives : " + str.toString());//This would throw a NullPointerExeption
答案 6 :(得分:1)
当参数为null
时,String.valueOf
会返回"null"
,但Object.toString
会抛出NullPointerException
,这是唯一的区别。
答案 7 :(得分:0)
我不能确切地说出差异是什么,但在字节级别操作时似乎有所不同。在下面的加密方案中,Object.toString()生成了一个无法解密的值,而String.valueOf()按预期工作...
private static char[] base64Encode(byte[] bytes)
{
return Base64.encode(bytes);
}
private static String encrypt(String encrypt_this) throws GeneralSecurityException, UnsupportedEncodingException
{
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
//THIS FAILED when attempting to decrypt the password
//return base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))).toString();
//THIS WORKED
return String.valueOf(base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))));
}//end of encrypt()
答案 8 :(得分:0)
当我们转换的对象是一个数组时,两种方法之间还有一个主要的区别。
使用Object.toString()转换数组时,您将获得某种垃圾值(@后跟数组的哈希码)。
要获得人类可读的toString(),必须使用String.valueOf(char []);请注意,此方法仅适用于char类型的Array。我建议使用Arrays.toString(Object [])将数组转换为String。
第二个区别是当对象为null时,ValueOf()返回String“null”,而toString()将返回空指针异常。
答案 9 :(得分:0)
String.valueOf()可以与没有toString()方法的原始类型一起使用。
答案 10 :(得分:-1)
下面显示了java.lang.String.valueOf的实现,如jdk8u25的源代码中所述。所以根据我的评论,没有区别。它调用&#34; Object.toString&#34;。对于原始类型,它以对象形式包装它并调用&#34; toString&#34;在它上面。
见下文:
/*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
public static String valueOf(char data[]) {
return new String(data);
}
public static String valueOf(char data[], int offset, int count) {
return new String(data, offset, count);
}
public static String copyValueOf(char data[], int offset, int count) {
return new String(data, offset, count);
}
public static String copyValueOf(char data[]) {
return new String(data);
}
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
public static String valueOf(char c) {
char data[] = {c};
return new String(data, true);
}
public static String valueOf(int i) {
return Integer.toString(i);
}
public static String valueOf(long l) {
return Long.toString(l);
}
public static String valueOf(float f) {
return Float.toString(f);
}
public static String valueOf(double d) {
return Double.toString(d);
}