Java8基礎之equals方法和==的區別


equals方法

equals用來比較的是兩個對象的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法體如下:

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

很顯然,在Object類中,equals方法是用來比較兩個對象的引用是否相等,即是否指向同一個對象。但是有些朋友又會有疑問了,為什么下面一段代碼的輸出結果是true?

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

要知道究竟,可以看一下String類重寫的equals方法的具體實現,其中value是一個字符數組,如下:

    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、對於==,如果作用於基本數據類型的變量,則直接比較其存儲的 "值"是否相等。int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。
2、如果作用於引用類型的變量,則比較的是所指向的對象的地址。

探索String str="abc"和String str=new String()區別

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


免責聲明!

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



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