java中的數據類型分為兩種:
一 、基本數據類型:
byte、short、int、long、float、double、char、boolean
比較它們需要用 == ,比較的是它們的值是否相等
二、引用數據類型:
也就是對基本數據類型的封裝,用 == 比較的是它們的內存地址(其實還是比較的基本數據類型,它們的內存地址不就是int嗎)。當new的時候,會給它一個新的內存地址,所以再通過==比較,就會返回false;在Object類中的equals方法其實比較的也是內存地址,用==和equals方法比較結果是一樣的,但在一些類中把equals方法重寫了,如String、Integer等類中,而不是單純的比較內存地址了。
這個equals方法不是固定的,有需要的時候,我們根據情況自己重寫。
下面用簡單的代碼來測試一下吧,里面的注釋要注意看哦!其中的java源碼在文章末尾有截圖
public class Text{ public static void main(String[] args){ String str = "abcd"; String str1 = "abcd1"; int i = 1; String str2 = new String("abcd"); //比較的是內存地址,內存地址是什么?一個16進制的整形值 //java對象內存地址經過哈希算法得出一個int類型數字 System.out.println( "abcd1" == str1 ); //用的是String的equals方法,對字符串進行挨個比較 System.out.println( str.equals("abcd") ); //在javac的時候,虛擬機把字符串自動組合了??? System.out.println( str.equals('a'+"bcd") ); //比較的是內存的地址,str2創建的時候,用了一個關鍵字new,明確告訴虛擬機,我要一個新的,所以字符串"abcd"被當做一個新的創建,並且有一個新的內存地址 if (str == str2) { System.out.println( "str == str2" ); }else{ System.out.println( "str != str2" ); //調用的String里面的hashCode方法(文章末尾有java源碼),所以相等.那String中的hashCode方法算的是什么呢?難道是ASCII? ////確實是ASCII碼, 作者自己算過, // //有些地方我們需要重寫hashCode方法,什么地方? //最常見的是當一個對象被加入收集對象(collection object)時,這兩個函數必須自己設計。更細化的定義是:如果你想將一個對象A放入另一個收集對象B里,
//或者使用這個對象A為查找一個元對象在收集對 象B里位置的鑰匙,並支持是否容納,刪除收集對象B里的元對象這樣的操作,那么,equals()和hashCode()函數必須開發者自己定義。
//其他情況下,這兩個函數是不需要定義的。 System.out.println( str.hashCode() ); System.out.println( str2.hashCode() ); } //調用String的equals java.lang.String中964行equals方法 //字符串底層是字符數組,所以String中的equals方法用兩個char數組,對立面的字符一個一個的比較 // //對象內容的比較才是設計equals()的真正目的,Java語言對equals()的要求如下,這些要求是必須遵循的。否則,你就不該浪費時間: //對稱性:如果x.equals(y)返回是“true”,那么y.equals(x)也應該返回是“true”。 //反射性:x.equals(x)必須返回是“true”。 //類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也應該返回是“true”。 //還有一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重復x.equals(y)多少次,返回都是“true”。 //任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。 // //有些情況下,我們需要自己重寫equals()方法,根據情況而定 if (str.equals(str2)) { System.out.println( "str equals str2" ); }else{ System.out.println( "str is not equals str2" ); } } }
運行結果:
總結:
== : 比較的是基本數據類型,比較的是它們的值
equals(): 比較的是引用數據類型,比較的是引用數據類型,不同類型有不同的equals方法,根據不同的數據類型調用不同的equals方法。也可以在特殊情況下重寫equals方法。
Object中的equals():
String中的equals():
String中的hashCode():