BigInteger.ValueOf() returns 缓存对象?
BigInteger.ValueOf() returns cached objects?
我写了一个测试代码来检查相等性。我检查了 Java 文档,它说 BigInteger
是不可变的。检查静态工厂方法的文档 valueOf
它看起来像 returns 已经缓存的不可变实例。那么为什么当它是缓存实例时 == returns false。
下面是 BigInteger
中 valueOf
的 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 false
而 equals()
将 return true
.
查看 BigInteger 的来源:
// If -MAX_CONSTANT < val < MAX_CONSTANT, return stashed constant
并且MAX_CONSTANT是16
我写了一个测试代码来检查相等性。我检查了 Java 文档,它说 BigInteger
是不可变的。检查静态工厂方法的文档 valueOf
它看起来像 returns 已经缓存的不可变实例。那么为什么当它是缓存实例时 == returns false。
下面是 BigInteger
中 valueOf
的 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 false
而 equals()
将 return true
.
查看 BigInteger 的来源:
// If -MAX_CONSTANT < val < MAX_CONSTANT, return stashed constant
并且MAX_CONSTANT是16