Java中处理Integer这种装箱类型时, 做了类似C++中字符串表的优化, 对 -128 到 127 直接的整数做了统一堆对象的引用, 如 值是 100 Integer 在堆中只存在一份, 所以可以使用 == 来判断, 而 不在此范围内的 就会是多份, 测试如下:
public class Test{
public static void main(String [] args){
// Integer n1 = 30000000;
Integer n2 = 10000000;
Integer n3 = 10000000;
System.out.println(n2 == n3);
System.out.println(n2.equals(n3));
}
}
结果是 false true
public class Test{
public static void main(String [] args){
// Integer n1 = 30000000;
Integer n2 = 100;
Integer n3 = 100;
System.out.println(n2 == n3);
System.out.println(n2.equals(n3));
}
}
结果是 ture true
结论, 如果比较操作的对象是 Integer 这类 装箱后的class, 一律使用 equals, 除非是 boolean 和 byte(有符号的, char 是无符号的) (因为他们就值域就在这个范围内)
附加:
另外像Integer 这种 class 虽然是对象, 但不能改变他的值, 因为它的类成员 value 是 final的, 所以传参时 不能实现 类似 C++ 中 &num 或 C# 中 ref num 这样的引用传参, 如果要在Java中实现, 就需要使用org.omg.CORBA 中的 IntHolder, BooleanHolder 等类型