@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。