java中,任何对象都继承自Object,所以都有equals()方法。在基本类型中,两个数值之间的比较==和equals()方法,比较的都是两个操作数的地址,地址相同,则返回值为true。在对象中,不管是自己写的对象还是java中已经有的对象,如果这个类对象复写了继承自Object类的equals()方法,将原地址比较改为内容比较,那么对象在使用equals()比较时,则比较的不再是两个对象的地址,而是比较的两个对象的存储内容。比如,String类,它复写了equals()方法,所以使用equals()方法比较两个字符串时,比较的是两个字符串的内容,但使用==比较的还是两个字符串的地址,这一点还是不变的。
接下来我们要看的是基本类型和它对应的封装类型比较时出现的自动拆箱和自动装箱问题。
1、比较表达式符号:==或者equals
2、比较表达式:
基本类型==基本类型的封装类型;
基本类型封装类型.equals(基本类型);
3、基本类型:byte,int,对应封装类型:Byte,Integer;
代码如下:
<pre style="color:#a9b7c6;font-family:Menlo;font-size:12.8pt;"><span style="color:#629755;">/
<span style="color:#629755;"> Created by cxh on 17/07/21.
<span style="color:#629755;"> /
<span style="color:#629755;">
<span style="color:#cc7832;">public class Main {
<span style="color:#cc7832;">public static void <span style="color:#ffc66d;">main(String argv[]){
Main test=<span style="color:#cc7832;">new Main()<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Integer i1=<span style="color:#6897bb;">100<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Integer i2=<span style="color:#6897bb;">128<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Integer i3=-<span style="color:#6897bb;">128<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Integer i4=<span style="color:#6897bb;">127<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Integer i9=<span style="color:#6897bb;">127<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Integer i10=<span style="color:#6897bb;">128<span style="color:#cc7832;">;
<span style="color:#cc7832;"> int i5=<span style="color:#6897bb;">100<span style="color:#cc7832;">;
<span style="color:#cc7832;"> int i6=<span style="color:#6897bb;">128<span style="color:#cc7832;">;
<span style="color:#cc7832;"> int i7=-<span style="color:#6897bb;">128<span style="color:#cc7832;">;
<span style="color:#cc7832;"> int i8=<span style="color:#6897bb;">127<span style="color:#cc7832;">;
<span style="color:#cc7832;">
<span style="color:#cc7832;"> Byte b1=-<span style="color:#6897bb;">128<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Byte b2=<span style="color:#6897bb;">127<span style="color:#cc7832;">;
<span style="color:#cc7832;"> Byte b3=<span style="color:#6897bb;">127<span style="color:#cc7832;">;
<span style="color:#cc7832;"> byte b4=-<span style="color:#6897bb;">128<span style="color:#cc7832;">;
<span style="color:#cc7832;"> byte b5=<span style="color:#6897bb;">127<span style="color:#cc7832;">;
<span style="color:#cc7832;"> byte b6=<span style="color:#6897bb;">127<span style="color:#cc7832;">;
<span style="color:#cc7832;">
<span style="color:#cc7832;"> <span style="color:#808080;">//封装类型==基本类型:封装类型先拆箱为基本类型,再进行数值上的比较.
<span style="color:#808080;"> System.<span style="color:#9876aa;">out.println(i1==i5)<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(i2==i6)<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(b1==b4)<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(b2==b5)<span style="color:#cc7832;">;
<span style="color:#cc7832;"> <span style="color:#808080;">//封装类型.equals(基本类型):基本类型先装箱为包装类型,如果基本类型不为空且数值和封装类型相同,则返回true
<span style="color:#808080;"> <span style="color:#629755;">/Integer对应的源码:
<span style="color:#629755;"> public boolean equals(Object obj) {
<span style="color:#629755;"> if (obj instanceof Integer) {
<span style="color:#629755;"> return value == ((Integer)obj).intValue();
<span style="color:#629755;"> }
<span style="color:#629755;"> return false;
<span style="color:#629755;"> }
<span style="color:#629755;"> /
<span style="color:#629755;"> System.<span style="color:#9876aa;">out.println(i1.equals(i5))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(i2.equals(i6))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(b1.equals(b4))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(b2.equals(b5))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> <span style="color:#808080;">//封装类型.equals(封装类型):先进行类型,类型相同的情况下,再比较值,如果值也相同,则返回true
<span style="color:#808080;"> System.<span style="color:#9876aa;">out.println(i3.equals(i7))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(i4.equals(i8))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(b3.equals(b6))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> <span style="color:#808080;">//封装类型==封装类型:Integer值如果在-128-127,则返回true,这和Integer.valueOf()的缓冲对象有关.否则返回false;
<span style="color:#808080;"> System.<span style="color:#9876aa;">out.println(i9.equals(i4))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> System.<span style="color:#9876aa;">out.println(i3.equals(i10))<span style="color:#cc7832;">;
<span style="color:#cc7832;"> }
}
结果如下:
true true true true true true true true true true true true false Process finished with exit code 0