1. 程式人生 > >java中.equals()方法和==號的區別

java中.equals()方法和==號的區別

主方法要進棧

==號和equals()方法都是比較是否相等的方法,那它們有什麼區別和聯絡呢? 
首先,==號在比較基本資料型別時比較的是值,而用==號比較兩個物件時比較的是兩個物件的地址值,實際上.equals()方法比較的就是相當於把變數進行打包,就是比較包裡面的內容:

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()方法一般都是比較兩個物件的值;

這個是.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;
    }

然後我下面列出我的測試程式碼:

package com.heima.string;

public class Demo2_String2 {
	
	public static void main(String[] args) {
		//demo1();
		//建立了兩個物件,一個在常量池中,還有一個在堆記憶體中
		//demo2();
		//demo3();
		//demo4();
		demo5();
	}

	private static void demo5() {
		String s1 = "ab";
		String s2 = "abc";
		String s3 = s1 + "c";
		System.out.println(s3 == s2);//false
		System.out.println(s3.equals(s2));//true
	}

	private static void demo4() {
		String s1 = "a" + "b" + "c";
		String s2 = "abc";
		System.out.println(s1 == s2);//true,在java中有常量優化機制
		System.out.println(s1.equals(s2));//true
	}

	private static void demo3() {
		String s1 = new String("abc");//記錄的是堆記憶體中的地址值
		String s2 = "abc";//記錄的是常量池中的地址值
		System.out.println(s1 == s2);//false
		System.out.println(s1.equals(s2));//true
	}

	private static void demo2() {
		String s1 = new String("abc");
		System.out.println(s1);//abc
	}

	private static void demo1() {
		String s1 = "abc";
		String s2 = "abc";
		System.out.println(s1 == s2);//true
		System.out.println(s1.equals(s2));//true
	}
}

在demo1中:這就涉及到了記憶體中的常量池,常量池屬於方法區的一部分,當執行到s1建立物件時,如果常量池中沒有,就在常量池中建立一個物件”abc”,第二次建立的時候,就直接使用,所以兩次建立的物件其實是同一個物件,它們的地址值相等。

所以兩個都是為true的;

在demo2中:

建立了兩個物件,一個在常量池中,一個在堆記憶體中;

在demo3中:

s1記錄的是堆記憶體的地址,s2是在常量池中;

在demo4中:

是常量優化原則;

在demo5中: