@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。
阿里巴巴强制要求使用包装类型定义属性?
1、默认值问题:使用基本数据类型定义属性时,如果没有给属性赋初始值,会使用默认值(如 int 的默认值为 0), 而使用包装类型定义属性,如果没有给属性赋初始值,属性的值为 null,这样可以更加清晰地表达属性的状态。
2、 拆箱问题:在一些特定场景下,如果使用基本数据类型定义属性,需要进行多次装箱和拆箱操作,这个操作会带来额外的性能开销和代码复杂度。而使用包装类型定义属性,可以避免这个问题,提高代码的效率和可读性。
3、Java 中的泛型中只能使用对象类型,如果要在泛型编程中使用基本类型,就必须使用对应的包装类型。
4. 提供了基本类型所不具备的方法和属性,比如 equals()、hashCode()、toString(),这些方法在某些特定场景中会比较有用