==和equals的區別


1.1 基本概念區分

1) 、對於==,比較的是值是否相等

如果作用於基本數據類型的變量,則直接比較其存儲的 值是否相等,

如果作用於引用類型的變量,則比較的是所指向的對象的地址是否相等。

其實==比較的不管是基本數據類型,還是引用數據類型的變量,比較的都是值,只是引用類型變量存的值是對象的地址

2) 、對於equals方法,比較的是是否是同一個對象

首先,equals()方法不能作用於基本數據類型的變量,

另外,equals()方法存在於Object類中,而Object類是所有類的直接或間接父類,所以說所有類中的equals()方法都繼承自Object類,在沒有重寫equals()方法的類中,調用equals()方法其實和使用==的效果一樣,也是比較的是引用類型的變量所指向的對象的地址,不過,Java提供的類中,有些類都重寫了equals()方法,重寫后的equals()方法一般都是比較兩個對象的值,比如String類。

Object類equals()方法源碼:

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

String類equals()方法源碼:

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

 

1.2 舉幾個例子就知道了

示例1:

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
System.out.println(str1.equals(str2)); // true

示例2:

String str3 = "abc";
String str4 = "abc";
System.out.println(str3 == str4); // true

各位客官看懂了嗎?

其實,str3與str4相等的原因是用到了內存中的常量池,當運行到str3創建對象時,如果常量池中沒有,就在常量池中創建一個對象"abc",第二次創建的時候,就直接使用,所以兩次創建的對象其實是同一個對象,它們的地址值相等。

再來一個:

示例3:

先定義學生Student類

package com.zwwhnly.springbootaction;

public class Student {
    private int age;

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

然后創建兩個Student實例來比較

Student student1 = new Student(23);
Student student2 = new Student(23);

System.out.println(student1.equals(student2)); // false

此時equals方法調用的是基類Object類的equals()方法,也就是==比較,所以返回false。

然后我們重寫下equals()方法,只要兩個學生的年齡相同,就認為是同一個學生。

package com.zwwhnly.springbootaction;

public class Student {
    private int age;

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

    @Override
    public boolean equals(Object obj) {
        Student student = (Student) obj;
        return this.age == student.age;
    }
}

此時再比較剛剛的兩個實例,返回true。

Student student1 = new Student(23);
Student student2 = new Student(23);

System.out.println(student1.equals(student2)); // true

 

這些都是最最基礎的內容,一定要記牢!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM