以前有碰到Integer“==”和Integer“equals”的问题,但是都没有总结,有时开发时也忘记注意了
最近有碰到这个问题了,发现是一个容易忽略的注意点,所以稍微整理了一下
看下面这段代码:
- /**
- * @author wuliwei
- *
- */
- public class IntegerEqualsTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Integer i1 = 2;
- Integer i2 = Integer.valueOf(2);
- Integer i3 = Integer.valueOf(2);
- Integer i4 = Integer.valueOf("2");
- Integer i5 = Integer.valueOf("2");
- System.out.println("test ==");
- System.out.println("i1 == i2 ? " + (i1 == i2));
- System.out.println("i1 == i4 ? " + (i1 == i4));
- System.out.println("i2 == i3 ? " + (i2 == i3));
- System.out.println("i2 == i4 ? " + (i2 == i4));
- System.out.println("i4 == i5 ? " + (i4 == i5));
- System.out.println("test equals");
- System.out.println("i1.equals(i2) ? " + i1.equals(i2));
- System.out.println("i1.equals(i4) ? " + i1.equals(i4));
- System.out.println("i2.equals(i3) ? " + i2.equals(i3));
- System.out.println("i2.equals(i4) ? " + i2.equals(i4));
- System.out.println("i4.equals(i5) ? " + i4.equals(i5));
- }
- }
先来分析下这段代码的对象创建过程:
Integer i1 = 2; 这条语句创建了一个整型对象
Integer i2 = Integer.valueOf(2); 这条语句不创建新的对象,i2和i1引用同一个对象
Integer i3 = Integer.valueOf(2); 这条语句不创建新的对象,i3和i1引用同一个对象
Integer i4 = Integer.valueOf("2"); 这条语句创建了一个整型对象
Integer i5 = Integer.valueOf("2"); 这条语句创建了一个整型对象
根据对象的创建过程,很明了,程序运行结果为:
- test ==
- i1 == i2 ? true
- i1 == i4 ? false
- i2 == i3 ? true
- i2 == i4 ? false
- i4 == i5 ? false
- test equals
- i1.equals(i2) ? true
- i1.equals(i4) ? true
- i2.equals(i3) ? true
- i2.equals(i4) ? true
- i4.equals(i5) ? true
感觉很简单,但实际的开发过程中,如果不注意,判断两个Integer相等就直接用“==”,但是在如今这个开源框架的天下,对象的创建很多时候并不是我们想的那样,所以类似Integer这种基础数据类型的相等,也应该跟String判断相等一样,用equals。
但是要注意下,如果是STRING类型的与整形用EQUALS判断结果是FALSE,主意类型。