12

我必须在项目中多次声明和初始化 BigDecimal 包装器对象。那么通过java代码哪个更好:

BigDecimal num=new BigDecimal("123"); 

或者在NumberUtils类中已经有一个静态方法可用

public static BigInteger createBigInteger(String str) {
    if (str == null) {
        return null;
    }
    return new BigInteger(str);
}

BigDecimal num=NumberUtils.createBigInteger("123"); 

请告诉我,当我们比较性能方面(内存和速度)时,哪种方法更好。

4

3 回答 3

24

很明显createBigInteger正在做更多的工作 - 它正在检查是否为空,当您知道参数值无论如何都不会为空时。不过,这只是一小部分额外的工作——几乎可以肯定在现实中是无关紧要的。

不过,如果这真的是一个性能问题,我会感到惊讶- 您是否确定这是您代码中的瓶颈?如果没有,请编写最易读的代码——对我来说,这将是构造函数调用。然后确定您的性能要求是什么,并针对它们测试您的整个系统。如果它的性能不够好,请编写更多测试或使用分析器来确定哪些区域导致了问题。

另一种选择是使用BigDecimal(int)构造函数 - 为什么要解析字符串?

BigDecimal num = new BigDecimal(123);

如果你愿意,你甚至可以把它作为一个常量,这样你就可以重用这个对象:

private static final BigDecimal DEFAULT_FOOBAR_VALUE = new BigDecimal(123);

// In a method or whatever...
BigDecimal num = DEFAULT_FOOBAR_VALUE;

除了性能之外,我认为这更清楚,因为它表明了常数的原因。

于 2013-10-25T10:01:42.930 回答
2

您可以使用以下常量来初始化 BigDecimal。

 BigDecimal.ZERO
 BigDecimal.ONE
 BigDecimal.Ten
BigDecimal average = BigDecimal.ZERO;
于 2019-12-30T05:46:30.137 回答
0

BigDecimal.

BigDecimal onePercentPlusABit = new BigDecimal(0.01);

不等于

BigDecimal onePercentExact = new BigDecimal("0.01");

和这个:

BigDecimal(0.01).setScale(2, RoundingMode.HALF_UP);

明显慢于

BigDecimal("0.01");
于 2016-08-31T20:03:36.920 回答