equals和==的區(qū)別小結

==

==比較的是變量(棧)內存中存放的對象的(堆)內存地址蟆技,用來判斷兩個對象的地址是否相同留潦,即是否是指相同一個對象锤悄。比較的是真正意義上的指針操作峦睡。

  1. 比較的是操作符兩端的操作數(shù)是否是同一個對象翎苫。
  2. 兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過。
  3. 比較的是地址赐俗,如果是具體的阿拉伯數(shù)字的比較拉队,值相等則為true。如:int a=10long b=10Ldouble c=10.0都是相同的(為true)阻逮,因為他們都指向地址為10的堆粱快。

equals

equals用來比較的是兩個對象的內容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對象事哭,如果沒有對該方法進行覆蓋的話漫雷,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷鳍咱。

String s="abce"是一種非常特殊的形式降盹,和new有本質的區(qū)別。它是java中唯一不需要new就可以產生對象的途徑谤辜。以String s="abce";形式賦值在java中叫直接量蓄坏,它是在常量池中而不是像new一樣放在壓縮堆中。這種形式的字符串丑念,在JVM內部發(fā)生字符串拘留涡戳,即當聲明這樣的一個字符串后,JVM會在常量池中先查找有沒有一個值為"abcd"的對象脯倚,如果有趋惨,就會把它賦給當前引用爬坑,即原來那個引用和現(xiàn)在這個引用指向了同一對象,如果沒有昔瞧,則在常量池中新創(chuàng)建一個"abcd"千扔,下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個對象琼稻,即以這種形式聲明的字符串幻馁,只要值相等庇配,任何多個引用都指向同一對象。
String s = new String("abcd");和其它任何對象一樣尊残,每調用一次就產生一個對象产园,只要它們調用。

也可以這么理解:String str = "hello";先在內存中找是不是有"hello"這個對象夜郁,如果有,就讓str指向那個"hello"粘勒。如果內存里沒有"hello"竞端,就創(chuàng)建一個新的對象保存"hello"。String str=new String("hello")就是不管內存里是不是已經有"hello"這個對象庙睡,都新建一個對象保存"hello"事富。

具體可以看下面的代碼:

public class EqualsTest {
    public static void main(String[] args) {
        String a = new String("ab"); // a為一個引用
        String b = new String("ab"); // b為另一個引用,對象的內容一樣
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 從常量池中查找
        if (aa == bb) { // true
            System.out.println("aa==bb");
        }
        if (a == b) { // false,非同一對象
            System.out.println("a==b");
        }
        if (a.equals(b)) { // true
            System.out.println("aEQb");
        }
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

equals和==的區(qū)別

equals方法最初是在所有類的基類Object中進行定義的乘陪,源碼是:

public boolean equals(Object obj) {
    return (this == obj);
}

由equals的源碼可以看出這里定義的equals與==是等效的(Object類中的equals沒什么區(qū)別)统台,不同的原因就在于有些類(像String、Integer等類)對equals進行了重寫啡邑,但是沒有對equals進行重寫的類(比如我們自己寫的類)就只能從Object類中繼承equals方法贱勃,其equals方法與==就也是等效的,除非我們在此類中重寫equals。

對equals重新需要注意五點:

  1. 自反性:對任意引用值x贵扰,x.equals(x)的返回值一定為true仇穗;
  2. 對稱性:對于任何引用值x和y,當且僅當y.equals(x)返回值為true時戚绕,x.equals(y)的返回值一定為true纹坐;
  3. 傳遞性:如果x.equals(y)=true,y.equals(z)=true舞丛,則x.equals(z)=true耘子;
  4. 一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變球切;
  5. 非空性:任何非空的引用值x谷誓,x.equals(null)的返回值一定為false 。

String類對equals的重寫如下:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

另外欧聘,"=="比"equals"運行速度快,因為"=="只是比較引用片林。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怀骤,隨后出現(xiàn)的幾起案子费封,更是在濱河造成了極大的恐慌,老刑警劉巖蒋伦,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弓摘,死亡現(xiàn)場離奇詭異,居然都是意外死亡痕届,警方通過查閱死者的電腦和手機韧献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來研叫,“玉大人锤窑,你說我怎么就攤上這事∪侣” “怎么了渊啰?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長申屹。 經常有香客問我绘证,道長,這世上最難降的妖魔是什么哗讥? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任嚷那,我火速辦了婚禮,結果婚禮上杆煞,老公的妹妹穿的比我還像新娘魏宽。我一直安慰自己腐泻,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布湖员。 她就那樣靜靜地躺著贫悄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娘摔。 梳的紋絲不亂的頭發(fā)上窄坦,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音凳寺,去河邊找鬼鸭津。 笑死,一個胖子當著我的面吹牛肠缨,可吹牛的內容都是我干的逆趋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼晒奕,長吁一口氣:“原來是場噩夢啊……” “哼闻书!你這毒婦竟也來了?” 一聲冷哼從身側響起脑慧,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤魄眉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闷袒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坑律,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年囊骤,在試婚紗的時候發(fā)現(xiàn)自己被綠了晃择。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡也物,死狀恐怖宫屠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情滑蚯,我是刑警寧澤激况,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站膘魄,受9級特大地震影響,放射性物質發(fā)生泄漏竭讳。R本人自食惡果不足惜创葡,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绢慢。 院中可真熱鬧灿渴,春花似錦洛波、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棘幸,卻和暖如春焰扳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背误续。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工吨悍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹋嵌。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓育瓜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栽烂。 傳聞我的和親對象是個殘疾皇子躏仇,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • == == 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同腺办,即是否是指相同一個...
    yeren108閱讀 294評論 0 0
  • ==: == 比較的是變量(棧)內存中存放的對象的(堆)內存地址焰手,用來判斷兩個對象的地址是否相同,即是否是指相同一...
    CQ_TYL閱讀 279評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理菇晃,服務發(fā)現(xiàn)册倒,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法磺送,類相關的語法驻子,內部類的語法,繼承相關的語法估灿,異常的語法崇呵,線程的語...
    子非魚_t_閱讀 31,597評論 18 399
  • 明天清晨要趕飛機,意料之中的馅袁,又失眠了域慷,算了一下,還有五個小時可以休息汗销,不睡也罷犹褒。 記憶中第一次...
    橋玄閱讀 330評論 2 5