最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中equals()方法實(shí)例詳解

 更新時(shí)間:2021年12月24日 10:23:47   作者:changshuchao  
equals方法是java.lang.Object類的方法,下面這篇文章主要給大家介紹了關(guān)于Java中equals()方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

equals()在哪里

首先我們知道Java中Object類是所有類的父類,它里面定義了equals()方法:

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

可以看到是使用= =來進(jìn)行比較的,那么= =是什么意思呢?其實(shí)是比較兩個(gè)對象的的內(nèi)存地址。(這里順便提一下,可以去了解一下Java的堆棧。)

=》若object1.equals(object2)為true,則表示equals1和equals2實(shí)際上是引用同一個(gè)對象。

Java中重寫的equals()

這里我們看一下java的一些自帶的包裝類怎么重寫equals()的:

String.java

    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;
    }

我們可以非常清晰的看到String的equals()方法是進(jìn)行內(nèi)容比較,而不是單純的引用比較。

Integer.java

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

其他的就不一一舉例了。

在Java中比較的推薦方法

所以我們一般比較基本數(shù)據(jù)類型的時(shí)候,使用"==",例如 int i = 0; if (i == 1){…},比較兩個(gè)Integer包裝類類型的時(shí)候就可以使用equals(),因?yàn)镴ava已經(jīng)重寫了equals()方法了。另外給出幾點(diǎn)建議,在java中進(jìn)行比較,我們需要根據(jù)比較的類型來選擇合適的比較方式:

  1. 對象域,使用equals方法 。
  2. 類型安全的枚舉,使用equals或== 。
  3. 可能為null的對象域 : 使用==null 和 equals 。
  4. 數(shù)組域 : 使用 Arrays.equals 。
  5. 除float和double外的原始數(shù)據(jù)類型(int,byte等) : 使用 == 。
  6. float類型: 使用Float.foatToIntBits轉(zhuǎn)換成int類型,然后使用==。
  7. double類型: 使用Double.doubleToLongBit轉(zhuǎn)換成long類型,然后使用==。

其中6,7參考java中的對應(yīng)的包裝類實(shí)現(xiàn):

public boolean equals(Object obj) {
    return (obj instanceof Float)
           && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }
}

為什么要在我們自己的類中重寫equals()

但是有時(shí)候我們不滿足于使用基本數(shù)據(jù)類型和Java實(shí)現(xiàn)的一些繼承自O(shè)bject的哪些類,比如我們實(shí)現(xiàn)一個(gè)Person類,它是繼承自O(shè)bject類的,所以它的equals()方法默認(rèn)使用的是文章開頭提到的哪個(gè)equals()方法,當(dāng)我們使用equals()進(jìn)行比較的時(shí)候,比較內(nèi)存地址,那么有可能出現(xiàn)兩個(gè)Person對象的參數(shù)都相同(比如年齡,身份證號等,在我們的實(shí)際認(rèn)知中認(rèn)為這兩個(gè)人就是一個(gè)人,應(yīng)該返回true),但是由于他們的內(nèi)存地址是不一樣的,所以equals()方法會返回false。

那么我們就需要去重寫equals()方法。

重寫equals()的規(guī)范

需要注意的是,在Java規(guī)范中,它對equals()方法的使用必須要遵循如下幾個(gè)規(guī)則:

  1. 自反性:對于任何非空引用值 x,x.equals(x) 都應(yīng)返回 true。
  2. 對稱性:對于任何非空引用值 x 和 y,當(dāng)且僅當(dāng)y.equals(x) 返回 true 時(shí),x.equals(y) 才應(yīng)返回 true。
  3. 傳遞性:對于任何非空引用值 x、y 和z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 應(yīng)返回 true。
  4. 一致性:對于任何非空引用值 x 和 y,多次調(diào)用 x.equals(y) 始終返回 true 或始終返回4、一致性:對于任何非空引用值 x 和 y,多次調(diào)用 x.equals(y) 始終返回 true 或始終返回false,前提是對象上 equals 比較中所用的信息沒有被修改
  5. 對于任何非空引用值 x,x.equals(null) 都應(yīng)返回false。

重寫equals()可能的誤區(qū)

查看下述代碼:

public class TestEquals {
    public static void main(String[] args) {
        Employee employee = new Employee("mily",1);
        Employee employee2 = new Employee("mily",2);
        Person p1 = new Person("mily");
        
        System.out.println(p1.equals(employee));
        System.out.println(p1.equals(employee2));
        System.out.println(employee.equals(employee2));
    }
}

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {

        if (obj instanceof Person) {
            Person person = (Person) obj;
            if (person.getName() == null | name == null) {
                return false;
            } else {
                return name.equalsIgnoreCase(person.getName());
            }
        }

        return false;
    }
}

class Employee extends Person {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Employee(String name, int id) {
        super(name);
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {

        if (obj instanceof Employee) {
            Employee employee = (Employee) obj;
            return super.equals(obj) && employee.getId() == id;
        }

        return false;
    }
}

輸出:

true

true

false

上述代碼中,我定義了一個(gè)Person類,有一個(gè)屬性name;還定義了一個(gè)Employee類,它是Person的子類,多出一個(gè)id的屬性;在測試代碼中“new”出了三個(gè)對象:

  1. name為mily,id為1的一個(gè)職員 —— employee
  2. name為mily,id為2的職員 —— employee2
  3. name為mily的一個(gè)普通人 —— p1

在大家的認(rèn)知下,應(yīng)該是三者都不是“equal”的,但是在執(zhí)行 p1.equals(employee)時(shí)返回的是true,仔細(xì)看了代碼之后你就會發(fā)現(xiàn)問題所在,代碼把employee當(dāng)成一個(gè)Person對象去執(zhí)行equals方法了,比較了name發(fā)現(xiàn)一樣,就認(rèn)為是“equal”了,這是一種很常見的誤區(qū)。

一般的equals()寫法

下面給出一個(gè)完美的 equals 方法的建議:

1、顯示參數(shù)命名為 otherObject,稍后會將它轉(zhuǎn)換成另一個(gè)叫做 other 的變量。

2、判斷比較的兩個(gè)對象引用是否相等,如果引用相等那么表示是同一個(gè)對象,那么當(dāng)然相等

3、如果 otherObject 為 null,直接返回false,表示不相等

4、比較 this 和 otherObject 是否是同一個(gè)類:如果 equals 的語義在每個(gè)子類中有所改變,就使用 getClass 檢測;如果所有的子類都有統(tǒng)一的定義,那么使用 instanceof 檢測

5、將 otherObject 轉(zhuǎn)換成對應(yīng)的類類型變量

6、最后對對象的屬性進(jìn)行比較。使用 == 比較基本類型,使用 equals 比較對象。如果都相等則返回true,否則返回false。注意如果是在子類中定義equals,則要包含 super.equals(other)

按照上述的equals()規(guī)范,我的實(shí)現(xiàn)如下:

public class TestEquals2 {
    public static void main(String[] args) {
        Employee employee = new Employee("mily",1);
        Employee employee2 = new Employee("mily",1);
        Person p1 = new Person("mily");

        System.out.println(p1.equals(employee));
        System.out.println(p1.equals(employee2));
        System.out.println(employee.equals(employee2));

        Employee employee3 = new Employee(null,1);
        Employee employee4 = new Employee(null,1);
        Person p2 = new Person(null);
        System.out.println(p2.equals(employee3));
        System.out.println(p2.equals(employee4));
        System.out.println(employee3.equals(employee4));
    }
}

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }

        if(obj == null || getClass() != obj.getClass()){
            return false;
        }

        Person person = (Person) obj;
        if(person.getName() == null | name == null) {
            return false;
        } else {
            return name.equalsIgnoreCase(person.getName());
        }

    }
}

class Employee extends Person {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Employee(String name, int id) {
        super(name);
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }

        if(obj == null || getClass() != obj.getClass()){
            return false;
        }

        Employee employee = (Employee) obj;
        if(employee.getName() == null | getName() == null) {
            return false;
        }else {
            return getName().equalsIgnoreCase(employee.getName()) && employee.getId() == id;
        }

    }
}

結(jié)果:

false

false

true

false

false

false

附:java中equals()方法的正確使用

在Java中比較兩個(gè)字符串是否相等,想必只要不是初學(xué)者都知道用equals()方法來進(jìn)行比較,但是實(shí)際上很多時(shí)候都用錯了。

就我自己開發(fā)而言,加入比較一個(gè)String s的內(nèi)容是否是"aaa"時(shí),往往會寫成如下代碼:

if(s.equals("aaa")){
    ...
}

乍一看沒什么問題,直到我裝了Alibaba Coding Guidelines 這個(gè)插件,一檢查,就告訴我這樣不對了。

為什么呢?因?yàn)楹芏嗲闆r下,并不能保證字符串s是不是為null,即直接這么判斷,很容易產(chǎn)生空指針異常的錯誤,因此正確的使用方法應(yīng)該是:

"aaa".equals(s);

總結(jié)

到此這篇關(guān)于Java中equals()方法的文章就介紹到這了,更多相關(guān)Java?equals()方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Java中為日期增加一天的多種方法

    在Java中為日期增加一天的多種方法

    這篇文章主要給大家介紹了關(guān)于如何在Java中為日期增加一天的多種方法,在JAVA業(yè)務(wù)代碼中,經(jīng)常會遇到通過指定時(shí)間,增加指定天數(shù)的業(yè)務(wù)需求,需要的朋友可以參考下
    2023-07-07
  • struts2入門介紹及代碼實(shí)例

    struts2入門介紹及代碼實(shí)例

    這篇文章主要介紹了struts2入門介紹及代碼實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java 關(guān)系運(yùn)算符詳情及案例(上)

    Java 關(guān)系運(yùn)算符詳情及案例(上)

    這篇文章主要介紹了Java 關(guān)系運(yùn)算符詳情及案例實(shí)現(xiàn),Java 也提供了許多類型的運(yùn)算符,可以根據(jù)需要使用它們來執(zhí)行各種計(jì)算和函數(shù),包括邏輯、算術(shù)、關(guān)系等。它們根據(jù)它們提供的功能進(jìn)行分類,下面將詳細(xì)介紹該內(nèi)容,需要的朋友可以參考一下
    2021-12-12
  • Java文件批量重命名批量提取特定類型文件

    Java文件批量重命名批量提取特定類型文件

    這篇文章主要介紹了Java文件批量重命名批量提取特定類型文件的相關(guān)資料
    2016-08-08
  • 寶塔面板配置及部署javaweb教程(全網(wǎng)最全)

    寶塔面板配置及部署javaweb教程(全網(wǎng)最全)

    這篇文章主要介紹了寶塔面板配置及部署javaweb教程(全網(wǎng)最全),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java實(shí)現(xiàn)字符串匹配(基于正則)

    Java實(shí)現(xiàn)字符串匹配(基于正則)

    這篇文章主要介紹了Java中使用正則表達(dá)式實(shí)現(xiàn)字符串匹配,字符串查找,匹配,替換,正則無不能做,特別是靈活的運(yùn)用子串匹配,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(Stack)實(shí)現(xiàn)詳解

    Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(Stack)實(shí)現(xiàn)詳解

    這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記第二篇,Java數(shù)據(jù)結(jié)構(gòu)與算法之棧Stack實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java多線程之多種鎖和阻塞隊(duì)列

    Java多線程之多種鎖和阻塞隊(duì)列

    今天帶大家學(xué)習(xí)的是Java多線程的相關(guān)知識,文章圍繞著java多種鎖和阻塞隊(duì)列展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • springcloud如何用Redlock實(shí)現(xiàn)分布式鎖

    springcloud如何用Redlock實(shí)現(xiàn)分布式鎖

    本文主要介紹了springcloud如何用Redlock實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java面試Logback打印日志如何獲取當(dāng)前方法名稱題解

    Java面試Logback打印日志如何獲取當(dāng)前方法名稱題解

    這篇文章主要為大家介紹了Java面試Logback打印日志如何獲取當(dāng)前方法名稱題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評論

常熟市| 铜鼓县| 呈贡县| 囊谦县| 昌邑市| 开原市| 天祝| 耒阳市| 全椒县| 永仁县| 溧阳市| 临湘市| 会泽县| 汽车| 华安县| 湄潭县| 呼伦贝尔市| 临泉县| 上栗县| 高安市| 安图县| 苏尼特右旗| 香格里拉县| 东平县| 霞浦县| 新建县| 高雄县| 自贡市| 余庆县| 乌拉特中旗| 荆州市| 新余市| 凤山市| 旌德县| 禄劝| 湘阴县| 吉木萨尔县| 滦南县| 西宁市| 铜山县| 嘉兴市|