2016-06-21 27 views
0

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

下面是valueOfBigInteger在Java文档:

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

下面的代码进入无限循环。

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

''==测试为参考平等, '.equals()'测试值是否相等 – azurefrog

+0

使用'equal()'检查是否相等。 – Li357

+1

对于原始类型'=='比较值,但对于它比较引用的对象。 – Gendarme

回答

2

BigInteger是一个引用变量,不像int或double,它们是原始变量。这意味着您不能像使用整数或双精度使用“==”。相反,你必须使用.equals(),类似于你如何使用String。

+0

在这种情况下,第二次调用的'valueOf'应该返回对同一个对象的引用。 – Jagger

+0

@Jagger'valueOf'没有指定任何类型的缓存行为。它被允许缓存,但绝不是这个义务。 –

+0

@LouisWasserman是的,你是对的。例如,这个'BigInteger.valueOf(100L)== BigInteger.valueOf(100L)'返回'false',这个'BigInteger.valueOf(1L)== BigInteger.valueOf(1L)'返回'true'。 – Jagger

-1

==检查引用而不是实际内容。出于这个原因,==通常用于像int,float等原始数据类型。不可变意味着每当更新现有值时,它都不会被修改,而是会创建一个新的值。因此,在您的示例中,即使两个物理物体的物理参数值不同,也是如此。

+0

这个答案不清楚或不正确 – ControlAltDel

6

不可变意味着只有在实例化后该值不能改变。

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

0

见BigInteger的源:

//如果-MAX_CONSTANT < VAL < MAX_CONSTANT,返回藏匿恒定

和MAX_CONSTANT是16