==和equals的區(qū)別

說在前面

最近很煩,項目遇上坑爹的期末,無論負(fù)責(zé)人怎么催,還是輸給了課程設(shè)計。遇上不可抗力的因素,真的沒法子了。


問題描述

今天就要去面試廣州南天了,一面和筆試都是裸著進(jìn)去的,結(jié)果過了,讓我去公司面試,對了,我大三,下學(xué)期是否實習(xí)講真的我也沒有個明確的想法,我還是很希望下學(xué)期能將現(xiàn)在做的產(chǎn)品推出去的,好了,不說那么多了,今天在隨機(jī)看一些面試題的時候發(fā)現(xiàn)對==好equals的區(qū)別點不大清晰,所以咯,一邊吐槽期末,一邊寫博客了。


java中的數(shù)據(jù)類型,可分為兩類:

  • 基本數(shù)據(jù)類型
    也稱原始數(shù)據(jù)類型。byte,short,char,int,long,float,double,boolean
    他們之間的比較,應(yīng)用雙等號(==),比較的是他們的值。
  • 復(fù)合數(shù)據(jù)類型(類)
    當(dāng)他們用(==)進(jìn)行比較的時候,比較的是他們在內(nèi)存中的存放地址,所以,除非 是同一個new出來的對象,他們的比較后的結(jié)果為true,否則比較后結(jié)果為false。 JAVA當(dāng)中所有的類都是繼承于Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內(nèi)存地 址,但在一些類庫當(dāng)中這個方法被覆蓋掉了,如String,Integer,Date在這些類當(dāng)中equals有其自身的實現(xiàn),而不再是比較類在堆內(nèi)存中的存放地址了。

老規(guī)矩,以源碼為導(dǎo)向


Demo1

public class Demo1 {
public static void main(String[] args) {
    String s1 = "Wednesday";
    String s2 = "Wednesday";
    if (s1 == s2) {
        System.out.println("s1 == s2");
    } else {
        System.out.println("s1 != s2");
    }
}

}

運行后的結(jié)果如下:s1 == s2


原因分析:
編譯并運行程序,輸出:s1 == s2說明:s1 與 s2 引用同一個 String 對象 -- "Wednesday"!程序在運行的時候會創(chuàng)建一個字符串緩沖池當(dāng)使用 s2 = "Wednesday" 這樣的表達(dá)是創(chuàng)建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創(chuàng)建的時候,程序找到了具有相同值的 s1,將s2引用s1所引用的對象"Wednesday",所以在輸出結(jié)果的時候


Demo2源碼:

  public class Demo2 {
  public static void main(String[] args) {
    String s1 = "Wednesday";
    String s2 = new String("Wednesday");
    if (s1 == s2) {
        System.out.println("s1 == s2");
    } else {
        System.out.println("s1 != s2");
    }
    if (s1.equals(s2)) {
        System.out.println("s1 equals s2");
    } else {
        System.out.println("s1 not equals s2");
    }
 }
}

運行后的結(jié)果如下:
s1 != s2
s1 equals s2


原因分析:
編譯并運行程序,輸出: s1 != s2,說明了s1 s2分別引用了兩個"Wednesday"String對象,與demo1的區(qū)別在于這里是new了一個對象出來,使用了 new 操作符,他們的值相同,但是位置不同,所以導(dǎo)致s1!=s2,而equals被覆蓋掉成比較值了,所以輸出 s1 equals s2。


Demo3

public class Demo3 {
public static void main(String[] args) {
    String s1 = "Wednesday";
    String s2 = new String("Wednesday");
    s2 = s2.intern();
    if (s1 == s2) {
        System.out.println("s1 == s2");
    } else {
        System.out.println("s1 != s2");
    }
    if (s1.equals(s2)) {
        System.out.println("s1 equals s2");
    } else {
        System.out.println("s1 not equals s2");
    }
 }
}

運行后的結(jié)果如下:
s1 == s2
s1 equals s2


原因分析:
java.lang.String的intern()方法"Wednesday".intern()方法的返回值還是字符串"Wednesday",表面上看起來好像這個方法沒什么用處。但實際上,它做了個小動作:檢查字符串池里是否存在"Wednesday"這么一個字符串,如果存在,就返回池里的字符串;如果不存在,該方法會 把"Wednesday"添加到字符串池中,然后再返回它的引用,而在demo3中我們可以看到Wednesday這個字符串已經(jīng)在字符串池中了,所以結(jié)果才會是s1 == s2 s1 equals s2。


Note:發(fā)布的這些文章全都是自己邊學(xué)邊總結(jié)的,難免有紕漏,如果發(fā)現(xiàn)有不足的地方,希望可以指出來,一起學(xué)習(xí)咯,么么噠。
開源愛好者,相信開源的力量必將改變世界:
??osc??? : https://git.oschina.net/xi_fan
github: https://github.com/wiatingpub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • equals方法和==的區(qū)別 首先大家知道,String既可以作為一個對象來使用,又可以作為一個基本類型來使用。這...
    加油小杜閱讀 433評論 0 0
  • 使用==進(jìn)行比較: 比較基礎(chǔ)數(shù)據(jù)類型(Java中基礎(chǔ)數(shù)據(jù)類型包括八中:short,int,long,float,d...
    檸檬師傅閱讀 412評論 0 0
  • 文/憶夏 乍一看標(biāo)題,也許你不以為然。也許你認(rèn)為25歲的你尚且年輕,來日方長。得,如果你真的這么想,您開心就好! ...
    阿正扯談閱讀 681評論 0 1
  • 我想你或許也只是被某種錯覺蠱惑。 畢竟未曾深談則稱某個人為soulmate,實在是不能更令人失笑的一件事。 都不了...
    少女主任閱讀 170評論 0 0

友情鏈接更多精彩內(nèi)容