神奇的Integer

  • 使用==的情况:
    • 如果比较Integer变量,默认比较的是地址值
    • Java的Integer维护了从-128~127的缓存池
    • 如果比较的某一边有操作表达式(例如a+b),那么比较的是具体数值
  • 使用equals()的情况:
    • 无论是Integer还是Long中的equals()默认比较的是数值
    • Long的equals()方法,JDK的默认实现:会判断是否是Long类型
  • 注意自动拆箱,自动装箱问题。

 

/**
 * @Auther: liuhaidong
 * Data: 2020/3/1 0001、17:24
 * Description:
 * @version: 1.0
 */
public class Test48 {
    public static void main(String[] paramArrayOfString) {
        Integer localInteger1 = Integer.valueOf(1);
        Integer localInteger2 = Integer.valueOf(2);
        Integer localInteger3 = Integer.valueOf(3);
        Integer localInteger4 = Integer.valueOf(3);
        Integer localInteger5 = Integer.valueOf(321);
        Integer localInteger6 = Integer.valueOf(321);
        Long localLong = Long.valueOf(3L);

        // 缓存池
        System.out.println(localInteger3 == localInteger4);

        // 超出缓存池范围
        System.out.println(localInteger5 == localInteger6);

        // 存在a+b数值表达式,比较的是数值
        System.out.println(localInteger3.intValue() == localInteger1.intValue() + localInteger2.intValue());

        // equals比较的是数值
        System.out.println(localInteger3.equals(Integer.valueOf(localInteger1.intValue() + localInteger2.intValue())));
        // 存在a+b数值表达式,比较的是数值
        System.out.println(localLong.longValue() == localInteger1.intValue() + localInteger2.intValue());
        // Long的equals()先判断传递进来的是不是Long类型,而a+b自动装箱的是Integer类型
        System.out.println(localLong.equals(Integer.valueOf(localInteger1.intValue() + localInteger2.intValue())));

        // ... 最后一句在这里漏掉了,大家应该可以推断出来
    }

}