我写了一个测试代码来检查相等性。我检查过Java doc,它说BigInteger
是不可变的。检查静态工厂方法valueOf
的文档,它看起来像是返回已经缓存的不可变实例。那么为什么==在缓存的实例时返回false。
以下是valueOf
中BigInteger
的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;
}
}
答案 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等)一起使用。不可变意味着每当更新现有值时,它都不会被修改,而是会创建一个新值。所以在你的例子中,尽管两者在物理上是相同的对象,但它们的引用值是不同的。