Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';调用Double.valueOf(字符串s)和新的Double(字符串s)之间的区别是什么?_Java - Fatal编程技术网

Java 什么';调用Double.valueOf(字符串s)和新的Double(字符串s)之间的区别是什么?

Java 什么';调用Double.valueOf(字符串s)和新的Double(字符串s)之间的区别是什么?,java,Java,所以我有一个字符串,我想创建一个双对象,用这个字符串作为值 我可以打电话 Double myDouble=新的Double(myString) 或者我可以打电话 Double myDouble=Double.valueOf(myString) 有区别吗?我猜第一个保证在堆上创建一个新对象,第二个保证可能重用现有对象 对于额外积分:字符串可能为null,在这种情况下,我希望Double为null,但上述两个字符串都会引发NullPointerException。有写作的方法吗 Double myD

所以我有一个字符串,我想创建一个双对象,用这个字符串作为值

我可以打电话

Double myDouble=新的Double(myString)

或者我可以打电话

Double myDouble=Double.valueOf(myString)

有区别吗?我猜第一个保证在堆上创建一个新对象,第二个保证可能重用现有对象

对于额外积分:字符串可能为null,在这种情况下,我希望Double为null,但上述两个字符串都会引发NullPointerException。有写作的方法吗

Double myDouble=myString==null?null:Double.valueOf(myString)


用更少的代码?

你的假设是正确的。第二种从字符串中获取Double的方法可以更快,因为该值可以从缓存中返回

关于第二个问题,您可以创建一个helper null-safe方法,该方法将返回null,而不是抛出NullPointerException。

来自apache

public static Double valueOf(String string) throws NumberFormatException {
          return new Double(parseDouble(string));
}
&

来自sun[oracle]jdk

 public Double(String s) throws NumberFormatException {
    // REMIND: this is inefficient
    this(valueOf(s).doubleValue());
    }
&


没有任何区别,至少在Oracle JDK 1.6中:

public Double(String s) throws NumberFormatException {
// REMIND: this is inefficient
this(valueOf(s).doubleValue());
}

取决于实施情况。使用双精度(字符串s)
的此实现:


因此,它调用了[Strase>Value](String S)内部,并且与直接调用该方法相比效率不高。

< P>如果您关注性能,则应该考虑使用原语。< /P>
double myDouble = Double.parseDouble(myString);

这将返回有效的Double,否则返回null

Double myDouble = null;
try {
    myDouble = Double.valueOf(myString);
}
catch (Exception e) { }

即使myString为空,它也能处理

您想如何给予额外的积分??您只能对每个答案投一票;-)我猜第一个保证在堆上创建一个新对象,第二个保证可能重用现有对象。你猜对了:-)@Andreas_D-我想可能有人的PayPal账户中支付了1000000美元,但你是对的:Stack Overflow rep的价值要高得多,所以我撤回了这个提议;-]从Java 9开始,
new Double(String)
和其他类似的构造函数调用被弃用,因为
valueOf
(或用于生成原语的
parseDouble
等方法)在较新的JDK实现中“可能产生显著更好的空间和时间性能”。区别在于注释。valueOf()创建一个Double对象,new Double()创建两个。但是,这使得传递非常重要的空值变得更加困难。(请不要建议传递NaN!)接受这个答案,因为它以短语“依赖于实现”开头,从其他答案中可以看出,事实上就是这样。这是来自特定JVM实现的实际源代码吗?可能有助于确定是哪一个。
this(valueOf(s).doubleValue());
double myDouble = Double.parseDouble(myString);
Double myDouble = null;
try {
    myDouble = Double.valueOf(myString);
}
catch (Exception e) { }