2011-10-06 60 views
4

有一个PMD rule说如果有预定义的常量,应该避免实例化BigInteger或BigDecimal。为什么要避免Java中的biginteger实例化

BigInteger.ZERO 

// instead of 

new BigInteger(0) 

会有比保存几个字节还有其他好处吗?

+1

它的大约48个字节。但是,这取决于它被称为是否重要。如果性能至关重要,那么BigInteger可能不是最佳解决方案。 –

回答

5

它避免了这几个字节,并需要分配到收集他们回来以后

在紧密循环,可以不管

2

可能的表现,如果你实例化一个很大0的。长/ int参数的替代方法是

BigInteger.valueOf(0)

返回BigInteger.ZERO当参数为0

1

而不是创建与new BigInteger一个新的对象,你最好使用它创建一次一个静态对象当BigInteger类被加载时。使用所有包装类型的valueOf也是如此。

+0

你的意思是'valueOf'使用那些常量吗? – deamon

+0

@deamon是检查http://www.docjar.com/docs/api/java/math/BigInteger.html#valueOf%28long%29在底部 –

+1

@deamon是的,'valueOf'使用最频繁的池使用的值。例如,'BigInteger.valueOf'缓存从-16到16的33个值,因此当您为这些值调用它时,您将始终为一个值获取相同的BitInteger对象。 'BigInteger.ZERO'只是'BigInteger.valueOf(0)'。 – tcb

1

通过使用缓存值,它可能会产生更好的空间和时间性能。