java equals和==的区别详解
大概说equals和==都比较的是什么:
1.booleantem=a==b;
首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容。因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用inta=1;这种形式来定义的变量)。如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较。而自动变量既不是类的实例也不是类的引用所以不能用equals()方法。
2.booleantem=a.equals("b");
equals()方法一般用于比较的是对象的内容但是也有的情况下也会去比较两个对象的地址。
接下来
写一个测试程序
packagecom; importjava.util.Date; publicclasstest{ publicstaticvoidmain(String[]args){ Integerinteger1=newInteger(1); Integerinteger2=newInteger(1); Stringstr1=newString("123"); Stringstr2=newString("123"); Datedate1=newDate(); Datedate2=newDate(); Doubledouble1=newDouble("1.0"); Doubledouble2=newDouble("1.0"); Booleantem1=newBoolean(true); Booleantem2=newBoolean(true); Objectobject1=newObject(); Objectobject2=newObject(); System.out.println("----Object------"); System.out.println(object1.equals(object2)); System.out.println(object1==object2); System.out.println(object1.equals(object1)); System.out.println(object1==object1); System.out.println("----Boolean------"); System.out.println(tem1.equals(tem2)); System.out.println(tem1==tem2); System.out.println("----Double------"); System.out.println(double1.equals(double2)); System.out.println(double1==double2); System.out.println("----Integer------"); System.out.println(integer1.equals(integer2)); System.out.println(integer1==integer2); System.out.println("----String------"); System.out.println(str1.equals(str2)); System.out.println(str1==str2); System.out.println("----Date------"); System.out.println(date1.equals(date2)); System.out.println(date1==date2); } }
结果:
----Object------
false
false
true
true
----Boolean------
true
false
----Double------
true
false
----Integer------
true
false
----String------
true
false
----Date------
true
false
首先对Object的比较,当比较的两个对象一样时,==和equals()的结果都是true,当两个对象不一样时返回的都是false。所以在==和equals用于比较对象时,他们比较的都是对象的地址,其实本质是一样的。下面是Object类中equals()方法的代码:
publicbooleanequals(Objectobj){ return(this==obj); }
而对于Boolean,Double(Float同理),Interger(Shot,Long同理),String,Date我也找了他们的源码,下面我依次贴出来在Boolean,Double,Interger,String,Date这些类中equals()方法的源码,这时候equals()方法就被重写了,因为这些类都是继承于Object类的嘛。
Boolean:
publicbooleanequals(Objectobj){ if(objinstanceofBoolean){ returnvalue==((Boolean)obj).booleanValue(); } returnfalse; }
Double:
publicbooleanequals(Objectobj){ return(objinstanceofDouble) &&(doubleToLongBits(((Double)obj).value)== doubleToLongBits(value)); }
Interger:
publicbooleanequals(Objectobj){ if(objinstanceofInteger){ returnvalue==((Integer)obj).intValue(); } returnfalse; }
String:
publicbooleanequals(ObjectanObject){ if(this==anObject){ returntrue; } if(anObjectinstanceofString){ StringanotherString=(String)anObject; intn=value.length; if(n==anotherString.value.length){ charv1[]=value; charv2[]=anotherString.value; inti=0; while(n--!=0){ if(v1[i]!=v2[i]) returnfalse; i++; } returntrue; } } returnfalse; }
Date:
publicbooleanequals(Objectobj){ returnobjinstanceofDate&&getTime()==((Date)obj).getTime(); }
也就是说在这些时候重写了Object类的equals()方法用于比较两个对象实际的内容而不再是地址了,当然肯定不只是这些,这里只是举出了几个比较常见的java原生类重写Object类的equals()方法的情况。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!