为什么Java的BigInteger有TEN和ONE常量?有什么实际用途吗?

58

为什么BigInteger类有常量TEN和ONE?将它们作为常量的实际用途是什么?我能理解一些关于ZERO的使用情况。


5
一般而言,这些数字是相当重要的,不是吗? - Denis Tulskiy
5
@Denis Tulskiy:我和楼主的想法一样。零是最重要的数字,其次是一。十只是一个任意进位制的好奇心而已,是个局外人。 - Bathsheba
13
我不明白数字00001010有什么特殊之处。 - Philipp
5
在任何整数系统中,零和一是特殊的值,而十对于那些主要熟悉阿拉伯数字系统的用户来说非常有用,例如几乎所有真实用户。 - Donal Fellows
12
我来这里的原因不正确,没有人在谈论我。 :P - zEro
显示剩余4条评论
5个回答

52

假设你编写了一个函数,在进行一些计算和数据库操作后返回BigInteger。你经常需要返回类似于null、0、1的值。使用BigInteger.ZERO很容易。这些值是公共的,因为它们通常是需要的。

public BigInteger findMyLovelyBigInteger(Integer secretNumber) {
    if (secretNumber == null) {
        return BigInteger.ZERO; // better than BigInteger.valueOf(0);
    } else {
        // some db operations
    }
}

此外,BigInteger.TEN 通常用于幂/除法/模运算。

查看 BigInteger 的公共方法。您将轻松了解它们的常见用例。


4
BigInteger.TEN 在 BigInteger 的公共方法中被使用在哪里? - Daniel S.
4
通常在进行乘方、除法和取模操作时,BigInteger.TEN 是常用的值。 - Mustafa Genç
4
为什么要使用 BigInteger.TEN 而不是 10? - Andy
10
如果您已经在处理 BigInteger 对象,使用定义的常量可以避免自动装箱/拆箱和创建新对象的需要。如果在某些循环中使用数千次,则可能会有所帮助。 - Drake Clarris
5
@Andy,因为BigInteger.TENBigInteger.valueOf(10)更清晰易懂,特别是如果你使用了import static - Kevin
显示剩余5条评论

21

在数学上可能是最基本的数字之一(和零一起)。由于这个原因,它似乎值得有自己的常数。实际上,在许多算法中,它作为一个常数是非常有用的。

在BigInteger上下文中很重要,因为它是十进制数系统的基数。这很重要,因为几个BigInteger函数需要一个基数(例如BigInteger.toString(int radix))。因此,这是一个非常有用的常数。


3
除了 TEN 是一个 BigInteger 而不是 int 类型,所以对于这些方法来说它没有用处。 - Joey
3
如果 TEN 只是内部使用,那为什么要公开呢? - cx0der
3
明确的需求是重复使用现有的值对象。 - Marko Topolnik
3
BigInteger.TEN比BigInteger.valueOf(10)更快。 - AlexWien
4
他们今天可能被缓存了,但是在1996年Java 1.1发布时它们被缓存了吗? 因为这就是认真回答这个问题的荒谬之处。 - Marko Topolnik
显示剩余9条评论

11

我认为这是一项设计决策,因为Java API代码库的其他部分中使用了1和10。创建Big*是一个昂贵的操作,而使用常量避免了新对象的创建(无论如何,Big*是不可变的),代码更易读。

可能其他常量在API的其余部分中并不需要。

将它们公开可能是个错误。(Java API充满了“糟糕”的设计决策)


1
不幸的是,BigIntegers并不是不可变的。希望有时候能解决这个问题。 - Ingo
3
@Ingo,您能详细说明一下吗?Javadoc以“不可变的任意精度整数”开头。 - Puce
看起来在 JDK7 中它有更好的保护措施,但我记得看到构成字段是可见的(这样就可以例如更改 mag 数组)。无论如何,要实现完全不可变性,类应该是 final 的,任何字段都应该是私有的。(不过,通过反射进行变异仍然是可能的,就像 String 一样) - Ingo
+1 对于正确答案;答案是“为了性能”... - BlueRaja - Danny Pflughoeft
4
就我所知,无论在 JDK 的哪个版本中,BigInteger 都没有任何修改器方法或公共字段(除了静态常量)。这也防止您通过继承使其可变,因此它实际上不需要是 final。 - Taymon
@Taymon 如果是这样的话,那么我犯了错误。 - Ingo

6

我其实不太清楚,但也许是因为:

也许在内部他们经常使用这些常量?(我没有检查过源代码,但它是开源的)。

编辑:

例如:

看了代码后,我认为原因是他们在内部经常使用 ZERO 和 ONE。 可能认为其他人出于以上原因也可以从这些常量中受益。 或者也许他们还在其他类中使用这些常量。

TEN已添加到v1.5 似乎没有在内部使用,但也许被其他类使用?

http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/src/share/classes/java/math/BigInteger.java


@paulm 既然 OP 看起来理解了零作为常量的必要性,那么“零不等于0”或“十不等于10”的事实根本不相关。 - Bernhard Barker
@paulm "我可以理解一些使用 ZERO 的情况。" - Bernhard Barker
1
@paulm 但它们是这些值的BigInteger表示。 - Puce
1
TEN被用于BigDecimal。 - Denis Tulskiy
@Dukeling,“would've been private”或“could've been private”是个问题。也许只是决定其他人可能也会发现它们有用(它们是不可变的,因此对于相同的值没有多个实例是没有意义的,特别是对于常见的值)。 - Puce
显示剩余3条评论

-2

10、0和1几乎可以回答所有问题。例如,如果你想要得到42,你可以做一个(10 + 10 + 10 + 10 + 1 + 1):)


6
我可以使用valueof(42)来实现这一点。 - cx0der
4
在Stack Overflow上有幽默感?肯定不可能! - Ben Thurley

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