[Java基础]Integer
在Java中,Integer
类会对一些数值进行缓存,这样可以节省内存并提高性能。当你使用 Integer.valueOf(int)
方法来创建 Integer
对象时,对于数值在 -128 到 127 之间的整数,Java 会返回缓存中的对象实例。因此,对于这些范围内的整数,用 Integer.valueOf
创建的 Integer
对象实际上会引用同一个实例。
在你的示例代码中:
Integer i = Integer.valueOf(100);
Integer j = Integer.valueOf(100);
System.out.println(i == j);
由于100在 -128 到 127 的范围内,i
和 j
都会引用同一个 Integer
对象。因此,i == j
会返回 true
。
但是,如果你使用超过这个范围的整数,Integer.valueOf
会创建新的对象,因此它们的引用会不同。例如:
Integer i = Integer.valueOf(200);
Integer j = Integer.valueOf(200);
System.out.println(i == j); // 这将打印false
这是因为200超出了 -128 到 127 的缓存范围,i
和 j
会引用不同的 Integer
对象。
总结
- 对于 -128 到 127 之间的整数,使用
Integer.valueOf
会返回缓存中的对象实例,因此i == j
为true
。 - 对于超出 -128 到 127 范围的整数,
Integer.valueOf
会创建新的对象实例,因此i == j
为false
。
如果要比较 Integer
对象的值,推荐使用 equals
方法,而不是 ==
运算符:
System.out.println(i.equals(j)); // 比较值是否相等
ps:Integer的equals方法
equals
public boolean equals(Object obj)
Compares this object to the specified object.
The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.
将此对象与指定对象进行比较。当且仅当参数不为 null 并且是包含与此对象相同的 int 值的 Integer 对象时,结果才为 true。
可以看到包装类重写了equals方法,根据值来判断是否相等。
Integer a = 127;
Integer b= 127;
System.out.println(a == b); // true
System.out.println(a.equals(b)); // true
Integer c = 255;
Integer d = 255;
System.out.println(c == d); // false
System.out.println(c.equals(d)); // true