String.valueOf()与Object.toString()

MCM*_*ery 117 java string

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

Kub*_*czy 160

根据Java文档,String.valueOf()返回:

如果参数是null,那么一个字符串等于"null"; 否则,obj.toString()返回值.

所以除了额外的方法调用之外,应该没有什么区别.

此外,Object#toString如果实例是null,NullPointerException将抛出一个,所以可以说,它不太安全.

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
} 
Run Code Online (Sandbox Code Playgroud)

  • @Brandon - 不正确.如果**行为**以使javadoc无效的方式改变,则只需要改变它.1)这种方法发生的可能性为零.他们不会做出改变,保证规格的变化,如果他们这样做,他们*会改变规格.2)它不会使我的建议无效.如果您阅读了javadoc,那么您将看到记录的行为已经改变! (6认同)
  • 这是最好的答案.阅读并依赖javadocs,而不是代码.(对于Java的不同版本/版本,代码原则上可以是不同的.) (4认同)
  • @StephenC如果是这样的话,文档也必须改变.. (3认同)
  • 需要明确的是,您实际上不能调用 `String.valueOf(null)`,这是一个 NPE。它仅适用于为空的对象。 (3认同)
  • 引发异常的方法不是“更安全”吗?通常,当您的代码引发NullPointerException时,这是一件好事。暂时对开发人员来说感觉不太好(“ aww,不,现在我需要回去修复我的代码”),但是由于抛出了错误,因此您发现需要修复某些内容。否则,您将“ null”直接暴露给用户,除非您明确检查一个,否则不会收到错误报告,这在我看来似乎不太安全。 (2认同)
  • 解释不是这样的。`String.valueOf(null)` 实际上解析为 `valueOf(char[])` 重载。这是因为“char[]”是比“Object”更具体的类型。 (2认同)

Shi*_*rma 16

String.valueOf(Object)和Object.toString()之间的区别是:

1) 如果string为null,

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        
}  
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

string的toString()方法的签名或语法如下:

public String toString()
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 12

在Java中,String.valueOf(Object)和Object.toString()之间有什么区别吗?

是.

正如javadoc所解释的那样,String.valueOf((Object) null)将被视为特殊情况,而valueOf只会给你一个NPE.

这些是否有特定的代码约定?

没有.

使用哪种最适合您使用它的上下文的要求.(你需要格式化"null"吗?)

注意:这不是代码约定.这只是常识编程.更重要的是,您的代码是正确的,而不是遵循一些风格约定或"最佳实践"教条.


个人意见:

一些开发人员获得了(IMO)对"空"进行"防御"的坏习惯.因此,您会看到许多空值测试,并将空值视为特殊情况.这个想法似乎阻止了NPE的发生.

我认为这是一个坏主意.特别是,我认为如果你找到的null.toString()是你要做的就是"做好"而不考虑为什么会有这样的做法,这是一个坏主意String.valueOf(null).

一般来说,最好避免String.valueOf首先出现在那里......除非String.valueOf(Object)在您的应用程序或API设计中具有非常特定的含义.因此,不要避免使用大量防御性编码的NPE,最好让NPE发生,然后追踪并修复String.valueOf(char[])触发NPE 的意外源.

那么这在这里有什么用呢?

好吧,如果你考虑一下,使用String.valueOf(null) 可能是一种"做好事"的方式.这是要避免的.如果是意外的nullchar[]在上下文,它是更好地使用Object.


Kev*_*sen 6

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

  1. 原语没有 a,.toString()因为它们不是Object-class的实现,所以只能String.valueOf使用。
  2. String.valueOf会将给定的对象转换为nullString "null",而.toString()将抛出NullPointerException.
  3. String.valueOf当使用like 时,编译器将默认String s = "" + (...);使用。这就是为什么Object t = null; String s = "" + t;会导致 String "null",而不是 NPE 。编辑:实际上,它将使用StringBuilder.append,而不是String.valueOf。所以忽略我这里所说的。

除此之外,这里实际上是一个用例,其中String.valueOf.toString()具有不同的结果:

假设我们有一个这样的通用方法:

public static <T> T test(){
  String str = "test";
  return (T) str;
}
Run Code Online (Sandbox Code Playgroud)

我们将用一个称之为Integer类型是这样的:Main.<Integer>test()

当我们用String.valueOf它创建一个字符串时,它工作正常:

String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);
Run Code Online (Sandbox Code Playgroud)

这将输出test到 STDOUT。

随着.toString()但是,它不会工作:

String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);
Run Code Online (Sandbox Code Playgroud)

这将导致以下错误:

java.lang.ClassCastException: classjava.lang.String不能强制转换为 classjava.lang.Integer

在线试一下。

至于为什么,我可以参考这个分开的问题及其答案。简而言之:

  • 使用时.toString(),它将首先编译和评估对象,其中转换为T(在这种情况下为Stringto 转换Integer)将导致ClassCastException.
  • 使用时,String.valueOf它会在编译期间看到泛型TObject甚至不关心它是Integer. 所以它会投射ObjectObject(编译器会忽略)。然后它将使用String.valueOf(Object),从而产生String预期的结果。因此,即使String.valueOf(Object).toString()在内部对参数执行 a ,我们已经跳过了强制转换并将其视为 an Object,因此我们避免ClassCastException了使用.toString().

只是认为值得一提的是这里String.valueOf.toString()这里之间的额外区别。