Java經典面試題: == 和 equals( )的區別

司天巨集發表於2020-11-01

1. == 的用法

== 是一個運算子
作用域: 可以使用在基本資料型別變數和引用型別變數中

1.如果比較的是基本資料型別變數,比較兩個變數儲存的資料是否相等(不一定型別要相同)

public class Temp {
    public static void main(String[] args) {
        int i = 10;
        int j = 10;
        double d = 10.0;
        System.out.println(i == j); //true
        System.out.println(i == d); //true

        boolean b = true;
        // System.out.println(i==b);

        char c = 10;
        System.out.println(i == c); //true

        char c1='A';
        char c2=65;
        System.out.println(c1==c2); //true
    }
}

記憶體模型
在這裡插入圖片描述

2.如果比較的是引用資料型別變數,比較兩個物件的地址值 ==> 即兩引用是否指向同一個物件實體

public class Temp {
    public static void main(String[] args) {
        Customer c1 = new Customer("小明", 20);
        Customer c2 = new Customer("小明", 20);
        System.out.println(c1 == c2); //false
		// String
 		String str1 = new String("sth");
        String str2 = new String("sth");
        System.out.println(str1 == str2); // false
    }
}

class Customer {
    private String namg;
    private int age;

    public Customer(String namg, int age) {
        this.namg = namg;
        this.age = age;
    }

    public String getNamg() {
        return namg;
    }

    public void setNamg(String namg) {
        this.namg = namg;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

記憶體模型
在這裡插入圖片描述

2. equals( ) 方法的使用

1.是一個方法.而非運算子
2. 只能適用引用資料型別

Customer 此處使用的是Object 中的equals(), 實際比較的是在棧中的 地址值

public class Temp {
    public static void main(String[] args) {
        Customer c1 = new Customer("小明", 20);
        Customer c2 = new Customer("小明", 20);


        System.out.println(c1.equals(c2)); //fasle
    }
}

在這裡插入圖片描述
3. 像Sring. Date .File . 包裝類等都重寫領導Object類中的equals( ) 方法. 重寫以後, 比較的不是兩個引用的地址值 是否相同.而是比較兩個物件的 "實體內容’’ 是否相同

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
4. 通常情況下,我們自定義的類如果使用equals() 的話,也通常比較的是兩個物件的" 實體內容" 是否相同,那麼我們需要對Object類中的equals() 進行重寫

  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Customer customer = (Customer) o;
        return age == customer.age &&
                Objects.equals(namg, customer.namg);
    }

總結

== 和equals() 的區別
1. == 既可以比較基本型別也可以比較引用型別,對於基本型別就是比較值,對於引用型別及時比較記憶體的地址
2. equals的話,他是屬於java.lang.Object類裡面的方法,如果該方法沒有被重寫過預設也是== ,我們可以看到String等類的equals方法是被重寫過的,而且String類在日常開發中用的比較多,久而久之,形成了equasl是比較值的錯誤觀點.
3. 具體要看自定義類裡面有沒有重寫Object的equals方法來判斷
4. 通常情況下,重寫equals方法,會比較類中的屬性是否相等

相關文章