1. 程式人生 > >equals和==的區別及詳解

equals和==的區別及詳解

equals和==的區別
java中equals();方法的原始碼是
public boolean equals(Object obj){
return (this=obj);
}
equals方法只是簡單的通過==,對於==,如果作用於基本資料型別的變數,則直接比較儲存的值是否相等;如果作用於引用資料型別的變數,則比較的是所指向的物件的地址,基本資料型別就存放在棧中,同樣存放在棧中的還有引用資料型別的引用,而真正的物件本身則存放在堆中,因此,equals方法只是比較兩個物件在記憶體中的引用地址是否相等
String s1=“hello”;
String s2=new String(“hello”);
System.out.println(S1==S2);
S1和s2的引用地址不同
System.out.println(s1.equals(s2));
結果是false,true
在java中,字串是引用資料型別,以例項物件的形式存在,因此,雖然s1與s2看上去定義方式不同,但是他們都新建了物件,本質其實是一樣的,如上所述==比較的是引用資料型別在棧中的地址是否相同,s1與s2都新建了兩個字串物件,當然開闢了兩個不同的記憶體空間,結果是false
看一下String   equals的原始碼
public boolean equals(Object anObject){
  if(this==anObject){
     return true;
}
  if(anObject instanceof String){
   String anotherString=(String)anObject;
}
}
String 中的equals方法對equals進行了重寫,重寫後equals()方法要判斷兩個字串的字元是否全部相等
基本資料型別;
byte,short,int,long
float,double,char,boolean;
引用資料型別;

陣列;類;介面;

String s1="abc";
String s2="abc";
System.out.println(s1==s2);
結果是 :true
我們知道一些基本資料型別的變數和物件的引用變數都是在函式的棧記憶體中分配,而堆記憶體中則存放new出來的物件和陣列,然而除此之外還有一塊區域叫做常量池,像我們通常String s1;這樣宣告的字串物件,其值就是儲存在常量池中,當我們建立String s1=這樣一個物件之後,就儲存到了常量池中,當我們建立引用String s2=的時候,java底層就會優先在常量池中查詢是否存在,如果存在則讓s2指向這個值,不會重新建立,如果常量池中沒有建立則建立並新增到常量池中,==比較的是索引地址是否相同,s1和s2返回的索引地址相同,所以結果是true

           棧                        堆
    dog  xt     f0         f0      new  dog()     存著屬性值
    dog  wc     f1         f1      new  dog()     存著屬性值
Dog xt=new Dog();
   xt.type="京巴";   //狗的品種屬性
通過xt.找到地址f0  通過棧的地址f0找到堆記憶體中的屬性   把值賦給屬性 
Dog  wc=new Dog();
  wc.name="旺財";
例子:
String name="呵呵";
Dog xt=new Dog();
system.out.peintln(xt.name);   輸出結果是 呵呵
Dog wc=xt;
  wc.name="旺財";
system.out.peintln(xt.name);旺財
system.out.peintln(wc.name);旺財
因為 xt把自己的地址f0給了wc,所以wc指向的地址是f0,自始至終只有一條狗,只是 叫的名不一樣,有人叫它xt有人叫wc,最後wc.name="旺財"改名,所以最後都是旺財