Java BigDecimal.ZERO与新的BigDecimal(0)。使用哪一个以及为什么?

Java BigDecimal.ZERO与新的BigDecimal(0)。使用哪一个以及为什么?,java,bigdecimal,Java,Bigdecimal,我想知道这两者是否相同。有人能证实吗?(我正在尝试用第二个替换第1个) 及 我询问的原因是,以第一种方式声明它是不合适的,因为您不应该创建已经存在的biginger和BigDecimal(零,一,十)的实例。所以我想知道我是否可以用第二种方式来表达,并且仍然可以考虑创建一个实例。而不是我必须创建一个变量zero或等于BigDecimal.zero。或者还有其他方法吗 我试过了 BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZER

我想知道这两者是否相同。有人能证实吗?(我正在尝试用第二个替换第1个)

我询问的原因是,以第一种方式声明它是不合适的,因为您不应该创建已经存在的
biginger
BigDecimal(零,一,十)
的实例。所以我想知道我是否可以用第二种方式来表达,并且仍然可以考虑创建一个实例。而不是我必须创建一个变量
zero
或等于
BigDecimal.zero
。或者还有其他方法吗

我试过了

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);

但是eclipse并不太高兴。

BigDecimal没有一个构造函数将BigDecimal作为参数,所以这就解释了为什么eclipse不喜欢它

BigDecimal是不可变的,这意味着一旦您创建了一个对象,它的状态就永远不会改变

此外,BigDecimal的equals和hashcode方法被重写为按值执行,这与对象的默认实现相反,后者比较引用。因此,从使用方式的角度来看,BigDecimal.ZERO和new BigDecimal(“0”)之间没有什么区别,只是创建一个新实例对JVM来说需要更多的工作(当您不再需要该对象时,会产生更多的垃圾)

BigDecimal是不可变的,并且基于值,这意味着所使用的特定引用对于使用BigDecimal的代码来说并不重要


因为已经为您创建了BigDecimal.ZERO,并且BigDecimal之间的比较是按值进行的,所以尽可能减少您使用的值的数量是有意义的,这样您的程序会创建更少的垃圾。这就是为什么鼓励您使用BigDecimal.ZERO。

在数学上,它们是相同的。另外,由于大小数是不可变的,您不需要担心创建新实例来进行新计算。只要对
totalCurrentSales
实例执行一些操作,实际上您将创建一个新的BigDecimal,并将
totalCurrentSales
引用重新指定给新值


从实例化的角度来看,它们不一定完全相同。例如,在OpenJDK 6b14实现中,
BigDecimal.ZERO
是通过调用私有的
新的BigDecimal(biginger,long,int)
构造函数来创建的,该构造函数的值为
biginger.ZERO
0
0


从代码质量的角度来看,使用
BigDecimal.ZERO
比使用
新的BigDecimal(0)
更可取,因为您可以避免额外的实例化并在代码中包含一个文本。

如果您真正理解这些概念,那么您可能已经知道解决方案:使用后者
BigDecimal totalCurrentSales=BigDecimal.ZERO
BigDecimal.ZERO
不是新实例。它是对现有实例的引用。为什么需要新实例@Dasky已经澄清了
BigDecimal
是不可变的。那么我最初说的是正确的吗<代码>BigDecimal totalCurrentSales=BigDecimal.ZEROnew?@erp,你不必在这里创建一个新实例,因为已经有一个(BigDecimal.ZERO)。BigDecimal.ZERO永远不会改变。它的值必须始终为0。你所说的最后一部分确实是我一直在寻找的。这里的仇恨已经超出了图表。谢谢你的回复。一个清晰简洁的回答+1使用不同的构造函数会导致
BigDecimal.ZERO
被“膨胀”,而
新的BigDecimal(0)
在内部使用数字的紧凑表示。这可能会影响性能。我只需要知道解决方案,因为它出现在声纳错误中。我知道在性能方面它可以忽略不计,但我只是想让它处于首选状态,因为这就是sonar的首要用途首先,我只是想理解作品评论中的所有来来回回的内容。谢谢你的回复。我本想检查一下,但我先看到了另一个+1.谢谢你的好意(tho:)
BigDecimal totalCurrentSales = BigDecimal.ZERO;
BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);