调用Double.valueOf(String s)和new Double(String s)有什么区别?

9

我有一个字符串,想用这个字符串作为值创建一个Double对象。

可以使用以下两种方式之一:

Double myDouble = new Double (myString);

Double myDouble = Double.valueOf(myString);

这两种方式有什么区别?第一种方式保证在堆上创建一个新的对象,而第二种方式可能会重复使用现有对象。

额外加分题:如果字符串是 null,则希望Double也是null,但上述两种方法都会抛出NullPointerException异常。是否有一种更简洁的写法?

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


3
您要如何给予额外的积分?您只能对每个答案进行一次点赞哦 ;-) - Andreas Dolk
1
你猜测的很正确 :-) 第一个保证在堆上创建一个新对象,而第二个可能会重用现有对象。 - Sean Patrick Floyd
2
@Andreas_D - 我曾经想过可能会向某人的PayPal账户支付100万美元,但你是对的:Stack Overflow声望更有价值,所以我撤回那个提议 ;-] - Rob Gilliam
1
从Java 9开始,new Double(String)和其他类似的构造函数调用已被弃用,因为在较新的JDK实现中,valueOf(或用于创建原始类型的parseDouble等方法)“可能会产生显着更好的空间和时间性能”。 - Joshua Goldberg
6个回答

3

来自Apache

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

&

public Double(String string) throws NumberFormatException {
          this(parseDouble(string));
}

来自 sun[oracle] jdk

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

&

public static Double valueOf(double d) {
        return new Double(d);
    }

这是来自特定JVM实现的实际源代码吗?可能有助于确定是哪一个。 - Rob Gilliam

3

这取决于实现方式。openJDK 6 b14 使用了以下实现方式的 Double(String s)

this(valueOf(s).doubleValue());

因此,它在内部调用valueOf(String s)方法,与直接调用该方法相比,效率必然较低。


2
接受这个答案,因为它以“取决于实现”的短语开头,而从其他答案中看来,这确实是情况。 - Rob Gilliam

3
你的假设是正确的。从字符串获取Double的第二种方法可能更快,因为值可以从缓存中返回。
关于第二个问题,你可以创建一个帮助器空安全方法,该方法将返回null而不是抛出NullPointerException。

2

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

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

1
区别在于注释。valueOf()创建一个Double对象,new Double()创建两个。 - Peter Lawrey

0

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

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

它甚至处理了当myString为空时的情况


0
如果您关心性能,应该考虑使用原始类型。
double myDouble = Double.parseDouble(myString);

这使得传递所有重要的空值变得更加困难。 (请不要建议传递NaN!) - Rob Gilliam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接