.equal()和==的區別


  1.首先,equal和==最根本的區別在於equal是一個方法,而==是一個運算符。

  2.一般來說,==運算符比較的是在內存中的物理地址,.equal()比較的是哈希算法值是否相等(即hashcode),且基本數據類型只能用==來進行比較。如果比較的雙方沒有哈希值,那么此時==和equal()比較的都是物理地址,可以互相替換(事實上在object類中equal()方法就是用==實現的,只是在有的需要比較哈希值的類中equal()方法被重寫了)。

  3.equal()可以重寫,在set集合中,jvm就是根據hashcode(),和equal()這兩個方法來判斷元素是否重復,如果要重寫,建議兩個方法一起重寫,否則可能會出現安全性問題。

  PS:下面講個有趣的東西,也是面試常考的,==比較字符串。眾所周知,字符串是被存在字符串池中的,那么什么情況下String a=String b呢?下面貼代碼。

package compareString;

public class CompareString {
public static void main(String [] args){
String a="Ye";
String b="Tian";
String c="YeTian";
String d=new String("YeTian");
String e=a+b;
String f="a"+"b";
String g="Ye"+"Tian";
System.out.println(c==d);
System.out.println(c==e);
System.out.println(c==e.intern());
System.out.println(c==f.intern());
System.out.println(c==g);
}
}

輸出結果如下:

false
false
true
false
true

  我們來一一說一下為什么,首先String c(YeTian)和String d,因為c是在字符串池創建的,保存在常量池里,d是new創建的對象,保存在堆上,所以內存地址肯定不同。然后String c和String e,這個很常見,運行時結果相等,但編譯時虛擬機並不能確定結果是否相等,所以為e開辟了新的內存空間,故結果不等。再是c和e.intern(),intern()這個方法很有趣,為了節省內存空間,我們一般是在StringBuffer里操作字符串,但intern()這個方法同樣實現了StringBuffer的某些功能,intern()方法的功能是,比較該String對象是否存在於字符串池內,如果存在,則返回池內的該值,如果不存在,則創建此字符串。因此,intern()方法一樣可以實現內存優化的作用,但一般還是建議使用StringBuffer。再然后是c和f,這個理由和之前一樣,編譯期間不能確定結果。最后是c和g,因為String類使用+運算符的本質是創建StringBuilder對象並運行append()方法,得到的值再運行toString()方法,而toString()方法會檢查字符串池內是否存在當前字符串,故c==g。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM