BigDecimal.ONE和new BigDecimal("1")之间的区别

9
下面这两行代码有什么区别?
BigDecimal one = new BigDecimal("1");
BigDecimal two = BigDecimal.ONE;

这两行代码是一样的吗?
谢谢!
2个回答

20
不完全相同,new BigDecimal("1") 每次执行都会分配一个新的对象(并且还需要解析值);而 BigDecimal.ONE 则每次使用对同一个现有对象的引用。
由于 BigDecimal 是不可变的,因此您可以自由地重复使用现有实例 - 因此指定已知值的“预先制成”对象是有意义的。

@Skeet:感谢您的回复。就功能而言,两者是相同的,对吧?如果方法被执行,我的意思是这两行代码会产生相同的输出。 - user1016403
@user1016403:是的,它们返回对相等对象的引用。但是仍然可以检测到差异。这取决于您对它们要做什么。 - Jon Skeet
@Skeet: 我有一个方法。目前我正在使用 BigDecimal one = new BigDecimal("1");。我能用 BigDecimal two = BigDecimal.ONE; 替换它吗?会有任何影响吗?谢谢! - user1016403
1
正如Jon所说,这取决于您以后对它们的处理方式。如果您执行a == b(即身份比较),那么是的,您的代码将表现不同。如果您只执行a.equals(b),那么不会。 - dty
@dty:我不会同时使用这两行代码,我只会使用其中一行。是否会有任何影响? - user1016403
1
@user1016403:你需要尝试理解这里的注释。如果你直接比较BigDecimal 引用,那么是的,你会看到一个变化。目前我们不知道你对该值做了什么。如果你使用它得当,除了减少工作量外,不应该看到任何变化。 - Jon Skeet

7

BigDecimal.ONE 是一个预扫描对象,与其他对象相比在内存利用方面更加高效。

BigDecimal one = new BigDecimal("1"); 

因为在这一行代码中首先创建了一个实例,然后解析字符串"1",最后进行赋值操作。

BigDecimal.ONE则像一个常量,可以直接给出数值。

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接