我编写了一个测试代码以检查平等。我已经检查了Java Doc,它说BigInteger
是不可变的。检查静态出厂方法valueOf
的文档看起来好像返回已经缓存的不变实例。那么,为什么==当其缓存实例时返回false。
以下是BigInteger
中的valueOf
的Java Doc:
返回一个大整数,其价值等于指定的价值 长的。此"静态工厂方法"优先于 (长)构造函数,因为它允许重复使用经常使用的 bigintegers。
以下代码进入无限循环。
public static void main(String[] args) {
while(true) {
BigInteger a = BigInteger.valueOf(100);
BigInteger c = BigInteger.valueOf(100);
if (a == c) {
break;
}
}
不变的意味着该值在实例化后不会改变。
具体来说,这并不意味着JVM必须确保您创建的每个值只有一个副本。您可以创建许多具有相同内部状态的不变对象,但它们仍然是不同的对象。将这些与==
进行比较将返回false
,而equals()
将返回true
。
biginteger是一个参考变量,与int或double不同,是原始变量。这意味着您不能像INT或双打一样使用" =="。相反,您必须使用.equals(),类似于用字符串的方式。
请参阅Biginteger的来源:
//如果-max_constant<Val<max_constant,返回库存常数
和max_constant是16
==检查参考而不是实际内容。因此,通常与原始数据类型(如int,float等)一起使用,每当您更新现有值时,它都不会被修改,而是将创建一个新的值。因此,在您的示例中,即使两者在物理上都是相同的对象,他们的引用值都不同。