Double.parseDouble(String) 和 Double.valueOf(String) 有什么区别?

68
我想将一个字符串转换为双精度浮点数类型。我不知道是否应该使用parseDouble或valueOf。
这两种方法有什么区别?
6个回答

87

parseDouble 返回一个基本类型的 double,其值是由字符串表示的值:

返回一个新的 double,它被初始化为由 Double 类的 valueOf 方法执行所表示的指定字符串的值。

valueOf 返回一个 Double 实例,如果已经缓存,则会返回同一个缓存实例。

返回表示指定 double 值的 Double 实例。 如果不需要新的 Double 实例,则通常应使用此方法,而不是 Double(double) 构造函数,因为通过缓存经常请求的值,此方法可能会产生明显更好的空间和时间性能。

为了避免创建新的 Double 对象实例的开销,通常应该使用valueOf方法。


5
如你所说,我认为parseDouble()更好。为什么要用valueOf()? - Bobs
14
如果你需要一个原始类型数据,通常我们建议使用parseDouble方法。只有在需要使用装箱类型Double时才要使用valueOf方法。请注意保持翻译后的内容与原文意思相同,更易于理解。 - Louis Wasserman
1
继@LouisWasserman所说的,如果你不知道他所指的"boxed double"是什么意思,他指的是自动装箱和拆箱。你可以在这里阅读相关内容:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html - ChallengeAccepted
1
楼主询问的是"Double.valueOf(string)",但您的回答提到的是"valueOf(double)"。 - palacsint
8
在通常使用的JVM(例如OpenJDK和Oracle JDK)中,“Double.valueOf(...)”不会缓存频繁请求的值。(要确认这一点,请尝试运行“assert Double.valueOf(1)== Double.valueOf(1);”) 因此,建议人们使用valueOf“以避免创建新的Double对象实例的开销”实际上是错过了重点。 正如其他人指出的那样,重要问题是装箱。如果您需要一个double,请使用parseDouble。如果您需要一个Double,请使用valueOf - Josh Milthorpe
显示剩余3条评论

38

Double.parseDouble(String)方法将返回一个基本数据类型double

Double.valueOf(String)方法将返回一个类型为Double的包装对象。

例如:

double d = Double.parseDouble("1");

Double d = Double.valueOf("1");

此外,valueOf(...)是一个重载方法,有两个变种:

  1. Double valueOf(String s)
  2. Double valueOf(double d)

parseDouble则是一个单一的方法,具有以下签名:

  1. double parseDouble(String s)

2

parseDouble()方法用于初始化一个字符串(应该包含一些数字值)...它返回的值是原始数据类型,如int、float等。

但是valueOf()创建了一个Wrapper类的对象。你必须解开它才能得到double值。这可以与巧克力相比较。制造商用一些箔或纸将巧克力包装起来,以防止污染。用户拿起巧克力,取下并扔掉包装纸,然后吃掉巧克力。

观察以下转换。

int k = 100; Integer it1 = new Integer(k);

使用Integer类将int数据类型k转换为对象it1。在Java编程中,可以将it1对象用于需要对象的k处。

以下代码可用于解开(从Integer对象中获取int)对象it1。

int m = it1.intValue();

System.out.println(m*m); // 输出 10000

//intValue() 是 Integer 类的一个方法,返回值为 int 数据类型。


1

它们都将字符串转换为双精度值,但是parseDouble()方法返回原始的double值,而valueOf()方法进一步将原始的double转换为包含原始double值的Double包装类对象。

从字符串到原始double的转换可能会抛出NFE(NumberFormatException),如果字符串中的值无法转换为原始double。


0

parseDouble() 的文档说:“返回一个新的 double,其值由指定的字符串表示,就像 Double 类的 valueOf 方法执行的那样”,因此它们应该是相同的。


0
如果您想将字符串转换为双精度数据类型,那么大多数人会选择parseDouble()方法。请参考以下示例代码:
String str = "123.67";
double d = parseDouble(str);

您将获得双精度值。请参阅tutorialData中的StringToDouble教程。


2
valueOf() 方法呢? - Bobs
返回一个Double对象,该对象保存由参数字符串s表示的双精度浮点数值。 - Rajshri

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