1. 程式人生 > >Java 集合學習之——equals和==的使用

Java 集合學習之——equals和==的使用

參考:

https://www.cnblogs.com/Eason-S/p/5524837.html

https://www.cnblogs.com/LittleHann/p/3690187.html

 

 

開始之前先做個定義:

==:

== 比較的是變數(棧)記憶體中存放的物件的(堆)記憶體地址,用來判斷兩個物件的地址是否相同,即是否是指相同一個物件。比較的是真正意義上的指標操作。

1、比較的是操作符兩端的運算元是否是同一個物件。
2、兩邊的運算元必須是同一型別的(可以是父子類之間)才能編譯通過。
3、比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為true,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。

equals:

  equals用來比較的是兩個物件的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有物件,如果沒有對該方法進行覆蓋的話,呼叫的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。

  String s="abce"是一種非常特殊的形式,和new 有本質的區別。它是java中唯一不需要new 就可以產生物件的途徑。以String s="abce";形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字串,在JVM內部發生字串拘留,即當宣告這樣的一個字串後,JVM會在常量池中先查詢有有沒有一個值為"abcd"的物件,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指點向了同一物件,如果沒有,則在常量池中新建立一個"abcd",下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個物件,即以這形式宣告的字串,只要值相等,任何多個引用都指向同一物件.
  而String s = new String("abcd");和其它任何物件一樣.每呼叫一次就產生一個物件,只要它們呼叫。

  也可以這麼理解: String str = "hello"; 先在記憶體中找是不是有"hello"這個物件,如果有,就讓str指向那個"hello".如果記憶體裡沒有"hello",就建立一個新的物件儲存"hello". String str=new String ("hello") 就是不管記憶體裡是不是已經有"hello"這個物件,都新建一個物件儲存"hello"。

 

然後整理了如下程式碼,執行完之後看結果:

package ids.autoview.tw.acconsys.test;

public class StringTest {
    public static void main(String[] args) {
        String s = "hello";
        String s1 = "hello";

        String s2 = new String("hello");
        String s3 = new String("hello");

        System.out.println(s == s1);
        System.out.println(s == s2);
        System.out.println(s == s3);

        System.out.println(s1 == s2);
        System.out.println(s1 == s3);

        System.out.println(s2 == s3);

        System.out.println(s.equals(s1));
        System.out.println(s.equals(s2));
        System.out.println(s.equals(s3));

        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));

        System.out.println(s2.equals(s3));

        Person p1 = new Person("xm");
        Person p2 = new Person("xm");

        System.out.println(p1 == p2);
        System.out.println(p1.equals(p2));

        System.out.println(s);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(p1);
        System.out.println(p2);



    }

    static class Person{
        String name;

        public  Person(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object obj) {
            Person temp = (Person)obj;
            if(temp.name.equals(this.name)){
                return true;
            }else{
                return false;
            }
        }
    }


}

執行結果:

true
false
false
false
false
false
true
true
true
true
true
true
false
true
hello
hello
hello
hello
[email protected]
[email protected]

Process finished with exit code 0

總結如下:

1、==比較的是物件引用是否相同,如果相同則是true,否則是false.對於字串,如果不是通過new來建立的,那字串都會常量池中檢查是否已經有該字串,如果有,則直接指向該字串,如果沒有再在常量池中建立,對於new出來的字串,或者其他物件執行==的時候都是false;

2、equals用來比較的是兩個物件的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有物件,如果沒有對該方法進行覆蓋的話,呼叫的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷,如果一個類不對equals重寫,那麼等價於判斷==是true還是false.