java基礎002-java中的`==`與`equals`詳解


在實際編程中,常常會須要比較兩個值或兩個對象是否相等(相同),這時咱們一般會使用==equals。那麼它們各自表明着什麼含義,又有什麼區別呢?今天來總結一下。html


關係操做符==

有兩種狀況:數據是基本類型,或引用類型(即對象)java

  1. 對於基本數據類型(八種),==比較的是值
  2. 對於引用類型,==比較的是所引用的對象是不是同一個,即指向的內存地址是否相同

下面看測試代碼:python

private static void main(String[] args) {
        int a1 = 10;
        int a2 = 10;
        System.out.println(a1 == a2);

        double d1 = 6.7;
        double d2 = 6.7;
        System.out.println(d1 == d2);

        boolean b1 = true;
        boolean b2 = true;
        System.out.println(b1 == b2);

        char c1 = 'x';
        char c2 = 'x';
        System.out.println(c1 == c2);
    }
複製代碼

測試結果:編程

true
true
true
true
複製代碼

equals方法

首先咱們要理解,這個equals方法是咱們要比較的對象所屬的類從超類Object一層一層繼承過來的。那麼咱們先看一下Object類中的源碼:bash

public class Object {
    public boolean equals(Object obj) {
        return (this == obj);
    }
}
複製代碼

哦,原來Object類的這個equals方法用的是==啊。那爲何String對象的equals方法竟然能比較兩個不一樣的對象相等呢?咱們看下String類的源碼:測試

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類重寫了Object類的equals方法,使用equals比較String對象變成了比較每個字符的值,因此相同的String對象纔會相等this

所以,在使用equals比較引用類型時,若是這個對象所屬的類重寫了equals方法,就按照這個規則來斷定。若是沒有重寫,那麼就按照Object類的equals方法判斷——也就是與==號相同了。spa

注:基本數據類型與引用類型不一樣,它不屬於任何類,也就沒有equals方法了。code

下面看測試代碼:htm

package com.eknown.basic;

/** * @author zfh * @version 1.0 * @since 2019/5/16 9:28 */
public class EqualsTest {

    public static void main(String[] args) {

        // 測試重寫了equals方法的String類對象
        System.out.println("測試重寫了equals方法的String類對象");
        String str1 = new String("abc"); // 注意:String str = "abc"和 str = new String("abc")是不一樣的。
        String str2 = new String("abc");
        String str3 = new String("gcc");

        System.out.println(str1.equals(str2));
        System.out.println(str1.equals(str3));

        // 測試未重寫equals方法的User對象
        System.out.println("測試未重寫equals方法的User對象");
        User user1 = new User(1, "java");
        User user2 = new User(2, "python");

        System.out.println(user1.equals(user2));
        System.out.println(user1 == user2);

        user2 = user1;
        User user3 = user1;
        System.out.println(user2.equals(user3));
    }
}

複製代碼
public class User {
    private Integer id;
    private String name;

    User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    // ... getters and setters
}

複製代碼

運行結果:

測試重寫了equals方法的String類對象
true
false
測試未重寫equals方法的User對象
false
false
true
複製代碼

參考:

  1. Matrix海子——淺談Java中的equals和==
相關文章
相關標籤/搜索