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

Posted

技术标签:

【中文标题】Double.parseDouble(String) 和 Double.valueOf(String) 有啥区别?【英文标题】:What is the difference between Double.parseDouble(String) and Double.valueOf(String)?Double.parseDouble(String) 和 Double.valueOf(String) 有什么区别? 【发布时间】:2012-05-21 14:23:39 【问题描述】:

我想将String 转换为Double 数据类型。我不知道我应该使用parseDouble 还是valueOf

这两种方法有什么区别?

【问题讨论】:

【参考方案1】:

parseDouble 返回一个包含字符串值的原始双精度:

返回一个新的 double,初始化为指定 String 表示的值,由 Double 类的 valueOf 方法执行。

valueOf 返回一个 Double 实例,如果已经缓存,你会得到相同的缓存实例。

返回一个表示指定双精度值的 Double 实例。如果 不需要一个新的 Double 实例,这个方法一般应该是 优先于构造函数 Double(double) 使用,因为此方法 可能会产生显着更好的空间和时间性能 缓存频繁请求的值。

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

【讨论】:

正如你所说,我认为 parseDouble() 是首选。为什么是 valueOf()? 如果你想要一个原语——你通常会这样做——然后更喜欢parseDoublevalueOf 仅在您想要盒装 Double 时才首选。 补充@LouisWasserman 所说的,如果你不知道他所说的盒装替身是什么意思,他指的是自动装箱和拆箱。你可以在这里阅读:docs.oracle.com/javase/tutorial/java/data/autoboxing.html OP 询问“Double.valueOf(string)”,但您的回答是“valueOf(double)”。 在常用的 JVM(例如 OpenJDK 和 Oracle JDK)中,Double.valueOf(...) 确实缓存频繁请求的值。 (要确认这一点,请尝试运行assert Double.valueOf(1) == Double.valueOf(1);)因此建议人们使用valueOf“以避免创建新的Double 对象实例的开销”确实没有抓住重点。正如其他人所指出的,重要的问题是拳击。如果您需要double,请使用parseDouble。如果您需要Double,请使用valueOf【参考方案2】:

Double.parseDouble(String) 将返回一个原始的double 类型。 Double.valueOf(String) 将返回一个 Double 类型的包装对象。

所以,例如:

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

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

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

    Double valueOf(String s) Double valueOf(double d)

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

    double parseDouble(String s)

【讨论】:

【参考方案3】:

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

但是 valueOf() 创建了一个 Wrapper 类的对象。您必须打开它才能获得双精度值。它可以与巧克力相提并论。制造商用一些箔纸或纸包裹巧克力以防止污染。用户拿起巧克力,取下并扔掉包装纸然后吃掉。

观察以下转换。

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

int 数据类型 k 被转换成一个对象,it1 使用 Integer 类。 it1 对象可用于 Java 编程中任何需要 k 的对象。

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

int m = it1.intValue();

System.out.println(m*m); // 打印 10000

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

【讨论】:

【参考方案4】:

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

如果 String 中的值不能转换为原始 double,则从 String 转换为原始 double 可能会引发 NFE(NumberFormatException)。

【讨论】:

【参考方案5】:

parseDouble() 的文档说“返回一个新的 double,初始化为指定 String 表示的值,由 Double 类的 valueOf 方法执行。”,所以它们应该是相同的。

【讨论】:

【参考方案6】:

如果要将字符串转换为双精度数据类型,那么大多数选择 parseDouble() 方法。 见示例代码:

String str = "123.67";
double d = parseDouble(str);

你会得到双倍的价值。请参阅tutorialData 上的 StringToDouble 教程。

【讨论】:

那么 valueOf() 方法呢? 返回一个 Double 对象,其中包含参数字符串 s 表示的双精度值。

以上是关于Double.parseDouble(String) 和 Double.valueOf(String) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Double类parseDouble()和valueOf()方法的区别

String转JSONObject

为啥 Double.parseDouble(null) 和 Integer.parseInt(null) 会抛出不同的异常?

java 四舍五入保留两位小数

创建搜索按钮(Double无法转换为String)

在Java中将String转换为double