equals 方法里面的“坑”


layout: post
title: equals 方法里面的“坑”
tags:

  • Java
  • 基礎(chǔ)知識(shí)
    categories: Java

今天遇到一個(gè)比較細(xì)節(jié)的bug,稍微有點(diǎn)基礎(chǔ)的都知道 == 和 equals 的用法,前者用于比較基本數(shù)據(jù)類型值是否相等,當(dāng)用于引用類型的時(shí)候,一般比較的都是引用地址,因此我們?cè)诒容^兩個(gè)對(duì)象是否相等時(shí)就用后者。然而。。。

先來看一段代碼:

Integer n1 = new Integer(21);
Integer n2 = new Integer(21);
System.out.println(n1 == n2);
System.out.println(n1.equals(n2));

不難知道。前者比較的引用,返回false,后者比較的內(nèi)容,返回true;

下面,我們自定義一個(gè)Student類:

class Student {
    private String name;
    private int age;
    
    public Student(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

省略掉了setter和getter,然后我們?cè)賮韓ew兩個(gè)對(duì)象比較一下:

Student s1 = new Student("Big",21);
Student s2 = new Student("Big",21);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

你能猜到打印的結(jié)果嗎??jī)蓚€(gè)都是false!這就很費(fèi)解了,為什么equals不好使了呢?這是因?yàn)椋?/p>

因?yàn)閑quals()方法默認(rèn)行為是比較引用,因此在新類中要自己重寫equals()方法,否則不可能表現(xiàn)出我們希望的行為。 ——《Thinking in Java》3.7.1

OK,到這里我們就發(fā)現(xiàn)了原因了,我們?cè)赟tudent類中添加一個(gè)equals方法:

    public boolean equals(Student s) {
        if (s != null && this.name.equals(s.name) && this.age == s.age)
            return true;
        return false;
    }

至此,問題解決,s1.equals(s2) 會(huì)返回我們期望的結(jié)果。雖然,問題很小,但是不了解equals方法的默認(rèn)行為的話,這個(gè)bug還是很難發(fā)現(xiàn)的。

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

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,854評(píng)論 18 399
  • 個(gè)人博客: 斯科特安的時(shí)間 今天看資料時(shí)看到coolshell的這篇文章,獲益匪淺,收藏到文庫(kù)里。 譯文原文:ht...
    斯科特安閱讀 5,331評(píng)論 4 23
  • 面向?qū)ο笾饕槍?duì)面向過程。 面向過程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物...
    sinpi閱讀 1,228評(píng)論 0 4
  • 一、出租車及打車應(yīng)用行業(yè)歷史背景 出租車行業(yè)最早出現(xiàn)的時(shí)候,由于車輛較少,經(jīng)營(yíng)基本上以電話預(yù)定或登門預(yù)約為主,人們...
    原軍鋒閱讀 2,463評(píng)論 0 14
  • 從上?;卣翗涞倪@些天,一直是在渾渾噩噩的吃睡中度過的,家里只有母親,弟弟,和我三人,父親在離樟樹一百公里外的吉水上...
    阿瞳丫丫閱讀 512評(píng)論 1 4

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