调用Double.valueOf(String s)和new Double(String s)之间的区别是什么?

时间:2011-01-21 11:01:38

标签: java

所以我有一个String,我想创建一个Double对象,将String作为值。

我可以打电话

Double myDouble = new Double (myString);

或者我可以致电

Double myDouble = Double.valueOf(myString);

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

要获得额外的功劳:字符串可能是 null ,在这种情况下,我希望Double为 null ,但以上两者都抛出一个NullPointerException。有没有一种写作方式

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

用更少的代码?

6 个答案:

答案 0 :(得分:3)

你的假设是对的。获取Double out of String的第二种方法可以更快,因为可以从缓存中返回值。

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

答案 1 :(得分: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);
    }

答案 2 :(得分:3)

取决于实施。 openJDK 6 b14使用Double(String s)

的此实现
this(valueOf(s).doubleValue());

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

答案 3 :(得分:2)

没有任何区别,至少在Oracle JDK 1.6中是这样的:

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

答案 4 :(得分:0)

如果您担心性能,则应考虑使用原语。

double myDouble = Double.parseDouble(myString);

答案 5 :(得分:0)

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

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

即使myString为空,它也可以处理