BigInteger.ValueOf()返回缓存的对象?

时间:2016-06-21 18:06:13

标签: java numbers biginteger

我写了一个测试代码来检查相等性。我检查过Java doc,它说BigInteger是不可变的。检查静态工厂方法valueOf的文档,它看起来像是返回已经缓存的不可变实例。那么为什么==在缓存的实例时返回false。

以下是valueOfBigInteger的Java文档:

  

返回一个Big Integer,其值等于指定值   长。优先提供这种“静态工厂方法”   (长)构造函数因为它允许重用经常使用的   BigIntegers。

以下代码将进入无限循环。

public static void main(String[] args) {
    while(true) {
        BigInteger a = BigInteger.valueOf(100);
        BigInteger c = BigInteger.valueOf(100);
        if (a == c) {
            break;
        }
 }

4 个答案:

答案 0 :(得分:6)

不可变仅表示实例化后该值无法更改。

具体而言,这并不意味着JVM必须确保您创建的每个值只有一个副本。您可以创建许多具有相同内部状态的不可变对象,但它们仍然是不同的对象。将这些与==进行比较将返回false,而equals()将返回true

答案 1 :(得分:2)

BigInteger是一个引用变量,与int或double不同,它们是原始变量。这意味着你不能使用" =="你可以用int或double。相反,您必须使用.equals(),类似于使用String的方式。

答案 2 :(得分:0)

参见BigInteger的来源:

  

//如果-MAX_CONSTANT< val< MAX_CONSTANT,返回存储常量

和MAX_CONSTANT是16

答案 3 :(得分:-1)

==检查参考而不是实际内容。因此,==通常与原始数据类型(如int,float等)一起使用。不可变意味着每当更新现有值时,它都不会被修改,而是会创建一个新值。所以在你的例子中,尽管两者在物理上是相同的对象,但它们的引用值是不同的。