当前位置: 首页 > 知识库问答 >
问题:

一串valueOf()与Object.toString()的比较

谷善
2023-03-14

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

共有3个答案

叶声
2023-03-14

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

对(如果你考虑超载,情况会更糟!)

正如javadoc所解释的那样,< code > string . value of((Object)null)将被< code>valueOf方法视为特殊情况,并返回值< code >“null”。相比之下,< code>null.toString()只会给你一个NPE。

原来< code > string . value of(null)(注意区别!)确实给了一个NPE...尽管有javadoc。真正的解释是模糊的:

>

  • String.valueOf有许多重载,但这里有两个相关:String.valueOf(Object)String.valueOf(char[])

    在表达式<code>字符串中。valueOf(null),这两个重载都适用,因为null与任何引用类型都是赋值兼容的。

    当有两个或多个适用的重载时,JLS 表示选择最具体参数类型的重载。

    由于< code>char[]是< code>Object的一个子类型,所以它更加具体。

    因此<code>字符串。valueOf(char[])重载被调用。

    <code>字符串。valueOf(char[])如果参数为空数组,则抛出NPE。与<code>字符串不同。valueOf(Object),它不将<code>null

    另一个例子更清楚地说明了value eOf(char[])重载的区别:

    char[] abc = new char[]('a', 'b', 'c');
    System.out.println(String.valueOf(abc));  // prints "abc"
    System.out.println(abc.toString());       // prints "[C@...."
    

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

    不。

    使用最适合您使用它的环境要求的。(您是否需要格式化来处理< code>null?)

    注意:这不是代码约定。这只是常识编程。代码正确比遵循某种风格惯例或“最佳实践”教条更重要。

    < sup>1 -您可以通过使用< code>javap -c检查具有< code > string . value of(null)调用的方法的代码来确认这一点。观察用于呼叫的过载。

    2-请阅读“无最佳实践”,并将此参考传递给下一个告诉您在编程或IT领域中做某事是“最佳实践”的人。

    一些开发人员养成了(IMO)“防御”空值的坏习惯。所以你会看到很多针对空值的测试,并且把空值作为特例来对待。这个想法似乎在阻止NPE的发生。

    我认为这是个坏主意。特别是,如果你发现null时所做的是试图“做好”,而不考虑为什么那里有null,我认为这是个坏主意。

    一般来说,最好首先避免null存在...除非null在您的应用程序或API设计中具有非常特定的含义。因此,与其避免使用大量防御性编码的NPE,不如让NPE发生,然后追踪并修复触发NPE的意外null的来源。

    那么这在这里是如何应用的呢?

    嗯,如果你仔细想想,使用< code>String.valueOf(obj)可能是一种“成功”的方式。这是应该避免的。如果< code>obj在上下文中意外地为< code>null,最好使用< code>obj.toString()。

  • 云宾鸿
    2023-03-14

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

    1) 如果字符串为空,

    < code > string . value of(Object)将返回< code >“null”,而< code>Object::toString()将引发空指针异常。

    public static void main(String args[]){  
        String str = null;
        
        System.out.println(String.valueOf(str));  // it will print null        
        System.out.println(str.toString()); // it will throw NullPointerException        
    }  
    

    2)签名:

    string 类的 valueOf() 方法是静态的。而 String 类的 toString() 方法是非静态的。

    字符串的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)
    

    string的< code>toString()方法的签名或语法如下所示:

    public String toString()
    
    卢磊
    2023-03-14

    根据Java文档,<code>字符串。valueOf()返回:

    如果参数为< code>null,则字符串等于< code >“null”;否则,返回< code>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
    } 
    
     类似资料:
    • 问题内容: 在Java中,和之间有什么区别?是否有针对这些的特定代码约定? 问题答案: 根据Java文档,返回: 如果参数是,则字符串等于; 否则,返回的值。 因此,除了附加的方法调用外,实际上没有什么区别。 另外,如果实例为,则将抛出a,因此可以说,它的 安全性 较低。

    • 问题内容: 我正在从事Java代码优化。我不清楚或符号之间的区别: 第2行和第3行有什么区别? 问题答案: 这种方法使用StringBuilder创建结果字符串 此方法仅调用的静态方法来获取int的String版本 依次调用

    • 问题内容: 在Javascript中,每个对象都有一个valueOf()和toString()方法。我本以为每当需要进行字符串转换时,都会调用toString()方法,但显然它被valueOf()压倒了。 例如,代码 将打印 例如,如果x是一个复数,这会让我感到反感。例如,我希望valueOf()给出其大小,但是每当我想转换为字符串时,我都会想要类似“ a + bi”的东西。而且我不想在隐含字符串

    • 问题内容: 我注意到我正在编写的Python脚本表现得很松散,并将其追溯到无限循环,其中循环条件为。在调试器中运行它,结果发现那条线实际上是。当我将其更改为!=’‘而不是时,它工作正常。 另外,即使比较或值,通常还是最好还是默认使用吗?我一直喜欢使用,因为我发现它在美学上更令人愉悦和pythonic(这就是我陷入这个陷阱的方式…),但是我想知道是否打算仅在你关心找到两个对象时才保留它?具有相同ID

    • 问题内容: 我想用几行代码来说明Java中要比较两个字符串(),必须使用而不是operator 。 这是我尝试过的东西: 我期待的输出是:,因为在测试中,我实际上是在比较两个引用(即地址)而不是对象的内容。 但事实上,我这样的输出:! 浏览我发现,一些Java实现将优化上述代码,以便在互联网和 将 实际引用相同的字符串。 好吧,当在Java中比较字符串(或对象)时,如何使用运算符演示问题? 问题答

    • valueOf 方法 返回 Array 对象的原始值。 语法: arrayObject.valueOf(); 返回值: arrayObject 的原始值。 说明: 原始值由 Array 对象派生的所有对象继承。 valueOf() 方法不创建新的数组,而是直接修改原有的数组。 注: 该方法会改变数组的长度。 valueOf() 方法通常由 JavaScript 在后台自动调用,并不显式地出现