BigInteger.ValueOf() returns 缓存对象?

BigInteger.ValueOf() returns cached objects?

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

下面是 BigIntegervalueOf 的 Java 文档:

Returns a Big Integer whose value is equal to that of the specified long. This "static factory method" is provided in preference to a (long) constructor because it allows for reuse of frequently used BigIntegers.

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

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

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

== 检查引用而不是实际内容。由于这个原因,== 通常与原始数据类型一起使用,如 int、float 等。不可变意味着无论何时更新现有值,它都不会被修改,而是会创建一个新值。因此,在您的示例中,即使两者在物理上是相同的对象,它们的引用值也不同。

不可变只是指实例化后值不能改变。

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

查看 BigInteger 的来源:

// If -MAX_CONSTANT < val < MAX_CONSTANT, return stashed constant

并且MAX_CONSTANT是16