==號 和 equals()方法的區別(複習)

//基本數據類型的比較
        int num1 = 10;
        int num2 = 10;
        System.out.println(num1 == num2);   //true
        //引用數據類型的比較
        String s1 = "chance";
        String s2 = "chance";
        System.out.println(s1 == s2);        //true
        System.out.println(s1.equals(s2));    //true
        //String類中==與equals的比較
        String s3 = new String("chance");     
        String s4 = new String("chance");
        System.out.println(s3 == s4);        //false
        System.out.println(s3.equals(s4));    //true
        //非String類中==與equals類型的比較
        Scanner scanner = new Scanner(System.in);      
        Scanner scanner2 = new Scanner(System.in);
        System.out.println(scanner.equals(scanner2));       //false
        Scanner sc = scanner;
        System.out.println(scanner.equals(sc));            //true

輸出:數組

truethis

truespa

truecode

false對象

trueblog

false繼承

true內存

1.==在基本數據類型中的比較
「==」 屬於關係運算符,比較的是兩個基本數據類型的值是否相等.字符串

int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2);

num1 和num2都是int型 它們的值都是10,所以使用」==」固然相等.遍歷

2.==在引用數據類型中的比較
2.1在String類中的比較
2.1.1不new String類對象時的比較

首先在引用數據類型中==比較的是引用的對象是否相等,便是否引用了同一個對象

String s1 = "chance";
String s2 = "chance";
System.out.println(s1 == s2);        //true
System.out.println(s1.equals(s2));    //true

當執行String s1 = 「chance」;這條語句時,會在堆中的字符常量池裏找」chance」這個字符串,若沒有找到,則將」chance」這個字符串放入字符串常量池中.而在棧中開闢一塊名爲s1的空間存放」chance」,這塊空間的引用.

當執行String s2 = 「chance」;這條語句時,會在堆中的字符串常量池裏找」chance」這個字符串,很顯然,能夠找到,因而便把字符常量池裏」chance」這個字符串的引用地址賦給s2,所以s1與s2存放的都是堆中字符常量池中的同一個」chance」的引用 
具體圖以下: 
这里写图片描述

接着System.out.println(s1.equals(s2));這裏的equals在String類中被重寫過,用來比較兩個字符串的實際內容是否相等,即每個字符是否相等,重寫方法末尾會另作說明!!!由於比較的是字符串內容,s1,s2內容都是chance固然是相等的。

2.1.2 new String類時的比較

String s3 = new String("chance");     
String s4 = new String("chance");
System.out.println(s3 == s4);        //false
System.out.println(s3.equals(s4));    //true

當程序執行String s3 = new String(「chance」); 這一句時,會在堆內存中開闢一塊空間用於存放」chance」這一字符串.並在棧中開闢一塊名爲s3的內存空間存放堆中剛剛建立的」chance」對象的引用.

程序執行String s4 = new String(「chance」); 這句時,會在堆內存中開闢另外一塊空間用於存放」chance」這一字符串,並在棧中開闢一塊名爲s4的內存空間存放堆中剛剛建立的」chance」對象的引用. 
由於s3和s4中存放的是兩個不一樣對象的引用,天然System.out.println(s3 == s4); 返回的是false; 
由於仍是String類 所以equals方法比較的仍是字符串中內容是否相等,即每一個字符是否相等。可見s3和s4這兩個對象中中存放都是」chance」,天然每一個字符都相等. 
圖示以下: 
这里写图片描述

2.2不在String類中的比較

以前有說過String類中重寫了equals,出於好奇,我找到了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;
    }

可見String類中的equals方法被重寫成,比較兩個對象中對象的內容是否相等,該方法將兩個String對象拆分紅字符數組,而後經過遍歷字符數組中的每個字符是否都相等,若相等,則返回true 不然返回false; 
而咱們查看通常對象的equals方法,其方法體以下:

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

三行代碼,判斷的就是兩個對象是否屬於一個對象

以下:

Scanner scanner = new Scanner(System.in);      
Scanner scanner2 = new Scanner(System.in);
System.out.println(scanner.equals(scanner2));       //false
Scanner sc = scanner;
System.out.println(scanner.equals(sc));            //true

執行第一條語句Scanner scanner = new Scanner(System.in); 時在堆中開闢了一塊內存存放Scanner對象,在棧內存中開闢一塊名爲scanenr的內存存放Scanner對象的引用.

執行第二條語句Scanner scanner2 = new Scanner(System.in); 時時在堆中另外開闢了一塊內存存放Scanner對象,在棧內存中開闢一塊名爲scanenr2的內存存放Scanner對象的引用. 
由於這裏調用的是通常對象的equals方法,所以比較的是兩個對象是否屬於同一個對象,顯然不是同一個對象. 
圖以下: 

这里写图片描述

至於最後一個Scanner sc = scanner;則將scanner對象的引用複製給sc所以,sc和scanner指向都是堆中同一個Scanner對象,天然比較的都是相等的. 
示例圖以下:

这里写图片描述

總結:

==是一個比較運算符號,既能夠比較基本數據類型,也能夠比較引用數據類型,基本數據類型比較的是值,引用數據類型比較的是地址值。 * equals方法是一個方法,只能比較引用數據類型,全部的對象都會繼承Object類中的方法,若是沒有重寫Object類中的equals方法,equals方法和==號比較引用數據類型無區別,重寫後的equals方法比較的是對象中的屬性。==和equals的做用都是同樣的,只不過在String類中重寫了equals方法,纔會變得這麼複雜!!!!

相關文章
相關標籤/搜索