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()? 如果你想要一个原语——你通常会这样做——然后更喜欢parseDouble
。 valueOf
仅在您想要盒装 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()方法的区别
为啥 Double.parseDouble(null) 和 Integer.parseInt(null) 会抛出不同的异常?