我从Java书中获得了以下代码,但没有对结果进行解释。我运行它并得到下面内联的结果,但我需要帮助理解结果:
1. Integer i = -10;
2. Integer j = -10;
3. System.out.print(i==j); // ==> true
4. System.out.print(i.equals(j)); // ==> true
5. Integer n = 128;
6. Integer m = 128;
7. System.out.print(n==m); // ==> false
8. System.out.print(n.equals(m)); // ==> true
我的问题是:
谢谢,如果提前。
答案 0 :(得分:9)
请参阅Integer.valueOf(int i)
源代码。
它缓存(使用整数池)-128和127之间的整数(这些是默认值,可以通过java.lang.Integer.IntegerCache.high
自定义)
答案 1 :(得分:2)
要强调在整数上使用==
导致的荒谬程度,请考虑以下这一行:
Integer a = 200, b = 200;
System.out.println(a < b || a == b || a > b);
显然,这应该打印true
而不管值是什么,因为它看起来像是重言式。当然,它打印false
。以下,显然是相同类型的重言式,打印出预期的true
值:
System.out.println(a <= b || a > b);
答案 2 :(得分:0)
Integer
是一个对象,而int
是一个“标量”。类似于Integer i = 270;
的内容变为Integer i = Integer.valueOf(270);
。因此,当您创建两个Integer
个对象时,它们是不同的(如==
所示)。
但是,valueOf
中的JDK缓存{ - 1}}对象的创建,其值较小 - -128到127,如果可用,则会重复使用这些对象的先前版本。因此,两个显然不同的小Integer
实例可能实际上是相同的,尽管它们似乎已经单独实例化。
如果您使用Integers
值尝试相同的操作,int
比较将始终为真,==
调用将生成编译错误(因为equals()
不是一个对象)。
答案 3 :(得分:0)
根据doc,Integer类包含一个原始值,这意味着您可以期望对象在需要时表现为基元(在步骤3中执行比较),同样作为需要时的对象(步骤4;如果使用 int 而不是 Integer 类,则无法执行此步骤。)。
如果将步骤1和2中的类型交换为字符串而不是整数,并再次执行测试,您将获得希望获得的所需结果。
上面已经回答:缓存特定范围(-128和127)中的整数。
希望这会有所帮助。