這是一個老生常談的問題了,不過我最近才仔細看。
一點體會,筆而記之。
先看這幾句代碼
- String s1 = "String";
- String s2 = "String";
- System.out.println(s1 == s2 );
- System.out.println(s1.equals(s2));
結果爲:
true
true
這個結果說明什麼呢?
==在java中是比較引用的,即在內存中的地址。而String的equals()是比較字符串的內容。
第二個true無可爭議,因爲s1和s2的內容顯然 相同。
第一個true呢?
這說明s1和s2的地址相同,s1和s2的地址爲什麼會相同?
查閱資料,發現 :
String s1 = "String";
這種方式,java首先會在緩衝區查找是否有"String"這個常量對象,有就直接將其地址賦給s1,沒有就創建一個"String",然後將其賦給s1;然後
String s2 = "String";
java同樣會在緩衝區中查找"String",這次能查找到了,因爲s1創建了一個"String",所以會將其地址賦給s2,如此,s1和s2便有了相同的地址。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OK。
再看這一段代碼
- String s3 = new String("String");
- String s4 = new String("String");
- System.out.println(s3 == s4);
- System.out.println(s3.equals(s4));
結果爲:
false
true
第二個true同樣無爭議。
第一個false說明s3和s4不是指向同一地址。
查閱資料發現,
String s3 = new String("String");會直接在內存中開闢一個空間存儲一個"String",並講引用賦給s3;
同樣 String s4 = new String("String");也會開闢一個空間,降低至給s4;
所以s3和s4的地址不一樣。
即
System.out.println(s3 == s4); 會打印出false。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
附
關於String的equals方法:
這是直接從jdk源碼複製的equals方法代碼:
- public boolean equals(Object anObject) {
- if (this == anObject) {
- return true;
- }
- if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = count;
- if (n == anotherString.count) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = offset;
- int j = anotherString.offset;
- while (n-- != 0) {
- if (v1[i++] != v2[j++])
- return false;
- }
- return true;
- }
- }
- return false;
- }
java的String是用字符數組模擬的。
從上面的代碼可以看出String的equals()的工作原理——
1、首先比較引用,如果引用相同,返回true;
2、比較類型,如果不是比較的不是String對象,返回false;
3、比較長度,字符串長度不等時,返回false;
4、逐個字符比較兩個字符串,遇到不一樣的字符,返回false;
5、到最後都一致,返回ture;