【java基礎】 == 和 equals() 的區別

==號和equals()方法都是比較是否相等的方法,那它們有什麼區別和聯繫呢? java

首先,==號在比較基本數據類型(指的值類型)時比較的是值,而用==號比較兩個對象時比較的是兩個對象的地址值ide

int x = 10;
int y = 10;
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(x == y); // 輸出true
System.out.println(str1 == str2); // 輸出false

那equals()方法呢?咱們能夠經過查看源碼知道,equals()方法存在於Object類中,由於Object類是全部類的直接或間接父類,也就是說全部的類中的equals()方法都繼承自Object類,而經過源碼咱們發現,Object類中equals()方法底層依賴的是==號,那麼,在全部沒有重寫equals()方法的類中,調用equals()方法其實和使用==號的效果同樣,也是比較的地址值,然而,Java提供的全部類中,絕大多數類都重寫了equals()方法,重寫後的equals()方法通常都是比較兩個對象的值:this

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student(23);
        Student s2 = new Student(23);
        System.out.println(s1.equals(s2));
    }
}

class Student{
    private int age;
    public Student(){}

    public Student(int age){
        this.age = age;
    }
}

這裏自定義了一個Student類,沒有重寫equals()方法,最後的輸出結果是:falsespa

class Student{
    private int age;
    public Student(){}

    public Student(int age){
        this.age = age;
    }

    @Override
    public boolean equals(Object obj){
        if (obj instanceof Student) {
            Student stu = (Student) obj;
            return this.hashCode() == stu.hashCode();
        }
        return false;
    }

    @Override
    public int hashCode(){
        return this.age;
    }
}

在重寫了equals()方法後,輸出結果變成了true。對象

如今一些基本的已經講的差很少了,接下來咱們回到第一個例子:blog

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2));
System.out.println(str1 == str2);

根據上面所講,第一個是true,第二個是false,確實如此,那繼續看下面的例子:繼承

String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);

此次的結果和上一個的是同樣的嗎?答案是:true true 
爲何第二個會是true呢? 
這就涉及到了內存中的常量池,常量池屬於方法區的一部分,當運行到s1建立對象時,若是常量池中沒有,就在常量池中建立一個對象」abc」,第二次建立的時候,就直接使用,因此兩次建立的對象實際上是同一個對象,它們的地址值相等。內存

那上一個例子中的源碼

String str1 = new String("abc");

是怎麼回事呢? 
這裏其實建立了兩次對象,因此str1和str2的地址值不相等。hash

相關文章
相關標籤/搜索