java中 == 和equals的區別

java中 == 和equals的區別

引言

== 比較運算符 , 比較的是值是否相等

equals方法,比較的是引用類型的變量所指向的對象的地址。

java中的數據類型,可分爲兩類:

1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean
他們之間的比較,應用雙等號( == ),比較的是他們的值。
2.複合數據類型(類)
當他們用( == )進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果爲true,否則比較後結果爲false。

JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。

對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因爲Object的equals方法也是用雙等號( == )進行比較的,所以比較後的結果跟雙等號( == )的結果相同。

1.比較String 對象:

public class Test {
public static void main(String[] args) {
    String s1 = "Apple";
    String s2 = "Apple";
if (s1 == s2)
 {
	    System.out.println("s1 == s2");}
else{
	    System.out.println("s1 != s2");}
 }
}

編譯並運行程序,輸出:s1 == s2
說明:s1 與 s2 引用同一個 String 對象 “Apple”!

2.創建String 對象:

public class Test {
public static void main(String[] args) {
String s1 = "Apple";
String s2 = new String("Apple");
if (s1 == s2)
	{System.out.println("s1 == s2");}
else
	{System.out.println("s1 != s2");}
if (s1.equals(s2)) 
	{System.out.println("s1 equals s2");}
else{
	System.out.println("s1 not equals s2");}
}
}

我們將s2用new操作符創建
程序輸出:
s1 != s2
s1 equals s2
說明:s1 s2分別引用了兩個"Apple"String對象

3. 字符串緩衝池

程序在運行的時候會創建一個字符串緩衝池當使用 s2 = “Apple” 這樣的表達是創建字符串的時候,程序首先會在這個String緩衝池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創建的時候,程序找到了具有相同值的 s1,將s2引用s1所引用的對象"Apple"。

第二段程序中,使用了 new 操作符,一個新的"Apple"Sting對象被創建在內存中。他們的值相同,但是位置不同。

4.更改程序:

public class Test {
public static void main(String[] args) {
String s1 = "Apple";
String s2 = new String("Apple");

s2 = s2.intern();

if (s1  ==  s2)
	{System.out.println("s1  == s2");}
else
	{System.out.println("s1 != s2");}
if (s1.equals(s2))
	 {System.out.println("s1 equals s2");}
else{
	System.out.println("s1 not equals s2");}
}
}

加入:s2 = s2.intern();
程序輸出:
s1 == s2
s1 equals s2
(java.lang.String的intern()方法"abc".intern()方法的返回值還是字符串"abc",檢查字符串池裏是否存在"abc"這麼一個字符串,如果存在,就返回池裏的字符串;如果不存在,該方法會 把"abc"添加到字符串池中,然後再返回它的引用。

4.總結:

  1. 對於==,比較的是值是否相等
    == 是一個比較運算符
    如果作用於基本數據類型的變量,則直接比較其存儲的 “值”是否相等;
    如果作用於引用類型的變量,則比較的是所指向的對象的地址

  2. 對於equals方法
    equals()是一個方法,只能比較引用數據類型。

注意:equals方法不能作用於基本數據類型的變量,equals繼承Object類,比較的是是否是同一個對象。

如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址

諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章