my_method
我知道如果数字大于编译器接受的数字,则使用字符串构造函数,但构造函数是否比其他构造函数更快?
答案 0 :(得分:3)
您可以查看源代码。
public BigDecimal(int val) {
intCompact = val;
}
public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}
public BigDecimal(char[] in, int offset, int len) {
...very long
}
显然,谁更快。
答案 1 :(得分:2)
将String
传递给BigDecimal
的构造函数需要解析String
和char查询字符。
传递int更快,因为它只产生一次分配。
在任何情况下,时差都不具有意义。
此处BigDecimal
的代码带有int
参数:
public BigDecimal(int val) {
intCompact = val;
}
BigDecimal
构造函数的代码String
调用BigDecimal(char[], int, int)
,代码大约有140行。
答案 2 :(得分:1)
构造函数new BigDecimal(10000)应该更快,因为它不必将字符串转换为数字。引擎盖下必须是对字符串函数的强制转换或其他调用,这会导致一些额外的开销。
public class benchmark {
public static void main(String [ ] args) {
timeFunction();
}
static void timeFunction() {
long startTime = System.nanoTime();
BigDecimal v1 = new BigDecimal("10000");
System.out.println("new BigDecimal(\"10000\") : " + (System.nanoTime() - startTime) / 1000000 + " ms");
startTime = System.nanoTime();
BigDecimal v2 = new BigDecimal(10000);
System.out.println("new BigDecimal(10000) : " + (System.nanoTime() - startTime) / 1000000 + " ms");
}
}
输出
new BigDecimal("10000") : 4 ms
new BigDecimal(10000) : 0 ms
答案 3 :(得分:1)
我知道如果数字大于编译器接受的数字,则使用字符串构造函数
这不是使用String
构造函数的唯一原因。使用String
构造函数的另一个原因是在创建BigDecimal
时保持该值不变。
如果你真的不关心精确度,你应该坚持使用double
而不是BigDecimal
。
但是其中一个构造函数比另一个
更快
您必须通过对代码进行基准测试来了解自己。话虽这么说,您应该更喜欢使用valueOf
方法而不是创建新的BigDecimal
,因为valueOf
将返回缓存的值。 (目前,范围从0到10,但是对于不同的JVM实现和HotSpot VM的未来实现,此范围可能更高,因此您最好使用valueOf
)
答案 4 :(得分:0)
自己找出时差&分析。喜欢: -
BigDecimal big = null;
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
big = new BigDecimal("10000");
}
long endTime = System.currentTimeMillis();
System.out.println("time Taken In String : " + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
big = new BigDecimal(10000);
}
endTime = System.currentTimeMillis();
System.out.println("time Taken in Numeric : " + (endTime - startTime));
PS: - 继续考虑垃圾收集。请将以上代码仅作为参考。