- 两个变量对应两个对象,它们之间用
==
判等结果的是false。 - 两个变量,引用同一个对象,它们直接用
==
判等结果的是true。 - null 之间用
==
判等结果的是true。 - 对象之间的值比较,用 equals 。要考虑两个都是null结果是true是否符合业务预期。
- Integer 之间,Integer和int 之间如果比较大小,则Integer会自动拆箱。
- Integer 之间的值比较,用 equals。
示例1
// 使用 Integer.valueOf 生成 Integer 对象
System.out.println( Integer.valueOf(1) >= Integer.valueOf(2) );
System.out.println( Integer.valueOf(1000) >= Integer.valueOf(2000) );
System.out.println( 1 >= Integer.valueOf(2) );
System.out.println( 1000 >= Integer.valueOf(2000) );
// 使用 new Integer 生成对象
System.out.println( new Integer(1) >= new Integer(2) );
System.out.println( new Integer(1000) >= new Integer(2000) );
System.out.println( 1 >= new Integer(2) );
System.out.println( 1000 >= new Integer(2000) );
System.out.println( new Integer(2) <= 1 );
System.out.println( new Integer(2000) <= 1000 );
System.out.println( new Integer(1) == new Integer(1) );
System.out.println( new Integer(1000) == new Integer(1000) );
结果都是 false。
示例2
System.out.println( 1 == new Integer(1) );
System.out.println( 1000 == new Integer(1000) );
System.out.println( new Integer(1) == 1 );
System.out.println( new Integer(1000) == 1000 );
结果都是 true。
示例3
这个示例是乍一看是不符合预期的:
System.out.println( Integer.valueOf(1) == Integer.valueOf(1) ); // true
System.out.println( Integer.valueOf(1000) == Integer.valueOf(1000) ); // false
Integer num1 = 1;
Integer num1000 = 1000;
System.out.println( num1 == Integer.valueOf(1) ); // true
System.out.println( num1000 == Integer.valueOf(1000) ); // false
System.out.println( (Integer)1 == Integer.valueOf(1) ); // true
System.out.println( (Integer)1000 == Integer.valueOf(1000) ); // false
直接上结论:
- Oracle JDK 在自动装箱时使用的 Integer.valueOf 将 int 变成 Integer。
- 使用 Integer.valueOf 时,对于[-128, 127]范围内的数字,会使用缓存起来的Integer对象,所以两个 Integer.valueOf(1) 指向的是同一个对象。具体见 Integer.valueOf 源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}