Java中 ==與equals知識點的一些補充

使用==時

基本類型變量:值相同即相同
引用類型變量:指向的地址相同即相同

String s1 = "aaa" ;
String s2 = "aaa" ;
System.out.println(s1 == s2);
//返回true
String s3 = new String("aaa");
String s4 = new String("bbb");
System.out.println(s3 == s4);
//返回false

==號與equals其實沒有區別,同樣要求兩個引用變量指向同一個對象纔會返回true。因此object類提供的equals方法其實沒有實際意義

通過重寫自定義相等標準,採用重寫equals方法來實現。String類本身就已經重寫了equals方法。只要字符串包含的字符序列相同,就返回true

String s1 = "abc" ;
	String s2 = "a" ;
	String s3 = "bc" ;
	
	String s4 = "a" + "bc" ;
	String s5 = "a" + "b" + "c" ;
	String s6 = s2 + s3 ;
	String s7 = new String("abc") ;
	
	System.out.println(s1 == s4);	//true
	System.out.println(s1 == s5);	//true
	System.out.println(s1 == s6);	//false
	System.out.println(s1 == s7);	//false

jvm常量池會保證相同的字符串只有一個,不會產生多個副本。
故s1、s4、s5 其實在編譯期就已經確定下來了,他們都是引用常量池一個字符串對象

使用new String創建的字符串對象在運行期創建出來的,他被保存在運行時的棧內存中,不會進入常量池。

判斷是否爲同一個類 A.getClass == B.getClass

重寫equals方法應該滿足下列條件:

自反性: x.equals(x)一定爲true
對稱性: x.equals(y)爲true,反過來也成立
傳遞性: x.equals(y)爲true,y.equals(z)爲true,則x對z也成立
對任何非null的x,x.equals(null)一定爲false

object默認提供的equals方法比較的是對象的地址,對於object類而言,equals於==號是結果完全一樣的。

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