我仍然感到困惑的是这三种方法之间的确切区别
例如:
Double d = 19.23456;
System.out.println(d.toString());
System.out.println(Double.toString(d));
System.out.println(String.valueOf(d));
所有上述方法都打印了这个值,但我想更多地了解这些方法之间的逻辑含义和差异。哪种方法适合哪种情况?
我已经通过以下链接,其中接受的答案声明toString(参数)和valueOf(参数)是相同的。那么toString
呢?可能是我错过了一个重要的观点。如果是这样,请将注意力转向它。
Integer.toString(int i) vs String.valueOf(int i)
我已阅读文档,但在阅读后我无法弄清楚差异。
根据官方文件:
的toString
Returns a string containing a concise, human-readable description of this object.
Subclasses are encouraged to override this method and provide an implementation that takes into account the object's type and data.
The default implementation is equivalent to the following expression:
getClass().getName() + '@' + Integer.toHexString(hashCode())
的toString(参数)
Returns a string containing a concise, human-readable description of the specified double value
的valueOf(参数)
Converts the specified object to its string representation. If the object is null return the string "null", otherwise use toString() to get the string representation.
提前谢谢
修改
我很满意Eran和zapl提供的答案。每个答案都在特定的视角内清除了此方法的概念。为了接受答案,我会接受一个。谢谢你清除我的怀疑。
答案 0 :(得分:3)
Integer.toString()
和Integer.toString(int)
之间的区别在于后者是静态方法,因此可以为原始变量调用。前者是实例方法,只能在引用类型上调用。
String.valueOf(Object)
与toString()
实例方法不同,因为String.valueOf(null)
会返回“null”,而null.toString()
会抛出NullPointerException
。
传递空Integer.toString(int)
引用时,NullPointerException
也会抛出Integer
,因为尝试取消Integer
会导致该异常。
因此,如果您有Integer i
变量,String.valueOf(i)
的行为与i.toString()
Integer.toString(i)
i
时null
的行为不同。< / p>
答案 1 :(得分:2)
这三种方法之间的确切区别是什么?
几乎没有。
通过JDK8的String.java
当您拥有原始double
时,它不能null
并直接转发到Double
。
3125 public static String valueOf(double d) {
3126 return Double.toString(d);
3127 }
如果您有Double
的盒装null
值,则会打印“null”或转发到对象toString()
方法。
2978 public static String valueOf(Object obj) {
2979 return (obj == null) ? "null" : obj.toString();
2980 }
JDK 8的Double.java
为避免代码重复,这只是将内部值转发给静态方法
643 public String toString() {
644 return toString(value);
645 }
静态方法通过委托一些“内部”实现来完成“实际工作”。
203 public static String toString(double d) {
204 return FloatingDecimal.toJavaFormatString(d);
205 }
无论你做什么。如果有值要打印,那么Double#toString(double d)
将完成这项工作。这同样适用于Integer
,..
当您执行String.valueOf(Object)
时,也会使用println("Value is: " + value)
。它会打印"null"
,而不是尝试在非现有对象上调用toString
方法。