在Java中,String.valueOf(Object)
和Object.toString()
之间有什么区别吗?这些是否有特定的代码约定?
在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()。
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()
根据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 在后台自动调用,并不显式地出现