String.valueOf()与Object.toString()

时间:2014-12-14 02:20:51

标签: java string

在Java中,String.valueOf(Object)Object.toString()之间有什么区别吗? 这些是否有特定的代码约定?

11 个答案:

答案 0 :(得分:148)

根据the Java documentationString.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) 可以成为一种“好”的方式。这是要避免的。如果上下文中objnull意外,则最好使用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)

其他答案已经提到了大多数,但是为了完整起见,我只是添加了它:

  1. 原语没有.toString(),因为它们不是Object类的实现,因此只能使用String.valueOf
  2. String.valueOf会将给定的对象null转换为字符串"null",而.toString()将抛出NullPointerException
  3. 在使用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

Try it online.

关于原因,我可以参考this separated question and its answers。简而言之:

  • 使用.toString()时,它将首先编译并评估对象,将导致对T的强制转换(在这种情况下为StringInteger的强制转换)在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);
    }