Integer、Long包装类的比较==/equals

发布时间 2023-06-21 10:46:08作者: shirleyLee
@Test
void test() {
    Long i = Long.valueOf(-1);
    Long j = Long.valueOf(1);
    Long k = 1L;
    Long m = 100L;
    Long u = 200L;

    System.out.println(i==-1);
    System.out.println(i.equals(-1));
    System.out.println("=======1==========");

    System.out.println(j==1);
    System.out.println(j.equals(1));
    System.out.println("=======2==========");

    System.out.println(k==1);
    System.out.println(k.equals(1));
    System.out.println("=======3==========");

    System.out.println(m==100);
    System.out.println(m.equals(100));
    System.out.println("=======4==========");

    System.out.println(m==100L);
    System.out.println(m.equals(100L));
    System.out.println("=======5==========");

    System.out.println(u==200);
    System.out.println(u.equals(200));
    System.out.println("=======6==========");

    Integer s = 1;
    Integer d = 1;
    System.out.println(s==d);

    Integer t = 200;
    Integer r = 200;
    System.out.println(t==r);
}

结果:

true
false
=======1==========
true
false
=======2==========
true
false
=======3==========
true
false
=======4==========
true
true
=======5==========
true
false
=======6==========
true
false

 

原理:

以Integer为例:

在 Integer 这个封装类里面,除了基本的 int 类型的操作之外,还引入了享元模式的设计,对-128 到 127 之间的数据做了一层缓存,如果 Integer 类型的目标值在-128 到 127 之间,就直接从缓存里面获取 Integer 这个对象实例并返回,否则创建一个新的 Integer 对象。

如果直接用==号来判断,返回的结果必然是 true,因为这两个 Integer 指向的内存地址是同一个。否则,返回的结果是 false。

如果使用equals比较,则是先比较类型再比较值,比如例4使用equals是false,比较类型是一个Integer。