注:大家都知道java中==与equals分别用于比较java对象的内存地址和实际的值,下面的例子中会用到这个两个运算符号。
1.比较-128-127以内的值和这个范围之外的值
Integer a = 1;
Integer b = 1;
Long c = 127L;
Long d = 127L;
Integer e = 321;
Integer f = 321;
Long h = 321L;
Long i = 321L;
System.out.println(a == b);
System.out.println(c == d);
System.out.println(e == f);
System.out.println(i == h);
System.out.println(e.equals(f));
System.out.println(h.equals(i));
输出的结果为:
true
true
false
false
true
true
结果说明:
根据之前的说明==比较的是内存地址,equals比较的是结果值,但是为什么-128到127使用==或
equals得出的结果是一样的,其他的数字确不一样?
因为在这个范围内的数字是会从缓存池中获取,不会新建对象,该范围内的数字对象为同一个对象,
所以出会出现上述结果
2.拆箱和装箱与比较运算符==、a.equals
Integer a = 1;Integer b = 2;
Long c = 1L;
Integer e = 3;
Integer h = 321;
Integer j = 322;
Long k = 321L;
Long m = 322L;
System.out.println(a.equals(c));//值相同,类型不同
//编译报错 System.out.println(a == c);
System.out.println(e.equals(a + b));//类型相同,结果值相同,使用equals比较System.out.println(e == (a + b));//类型相同,结果值相同,使用==比较
System.out.println(j.equals(a + h));//类型相同,结果值相同,使用equals比较
System.out.println(j == (a + h));//类型相同,结果值相同,使用==比较
System.out.println(m == (a + h));//类型不相同,结果值相同,使用==比较
System.out.println(m.equals(a + h));//类型不相同,结果值相同,使用equals比较
System.out.println(m.equals(a + k));//类型不相同进行运算,结果值相同,使用equals比较
System.out.println(m == a + k);//类型不相同进行运算,结果值相同,使用==比较
结果为:
false
true
true
true
true
true
false
true
true
1.第一个结果是false的原因是,Interger的equals方法,会判断类型是否相同,类型不同时直接返回
false
2.第二个结果是true是值相同类型相同,第三个为true的原因是包装类的==在遇到运算符时就进行自动拆箱,
拆箱后为基本数据类型int,直接比较存栈中的值,所以返回true
3.第四、五的结果和二三的结果一致,区别是,该值大于127
4.第六返回的结果为true的原因是使用==遇到了运算符,拆箱成基本数据类型,进行比较,返回ture
5.第7返回的结果为false的原因是a+h结果类型是Integer,Long封装类型同样会判断比较的数据类型,所以
返回false
6.第8返回的结果是true,说明a+k产生的结果值为封装类型Long
7.第9返回的结果是true,拆箱比较
总结:
包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱,以及它们equals()方法不处理数据类型
转换关系,在实际编码中尽量避免这样使用自动装箱和拆箱