java字串“==”與“equals”的差異及與c#的區別

westwolf發表於2021-09-09

.net中,其字串特有的駐留機制,保證了在同一程式中,相同字元序列的字串,只有一個例項,這樣能避免相同內容的字串重複例項化,以減少效能開銷。

先來回顧一下c#中的程式碼:

 public static void testString()
 2         {
 3             String s = "Abc";
 4             String s1 = "abc";
 5             String s2 = "abc";
 6 
 7 
 8             Console.WriteLine("s1==s2 ? " + (s1 == s2)); //true
 9             Console.WriteLine("s1.Equals(s2) ? " + s1.Equals(s2)); //true
10             Console.WriteLine("String.Compare(s1,s,true) ? " + String.Compare(s1, s, true)); //0
11             Console.WriteLine("------------------------");
12 
13 
14             char[] chr = { 'a', 'b', 'c' };
15             String s3 = new String(chr);
16             Console.WriteLine("s1==s3 ? " + (s1 == s3)); //true
17             Console.WriteLine("s1.equals(s3) ? " + s1.Equals(s3)); //true
18             Console.WriteLine("String.Compare(s3, s, true) ? " + String.Compare(s3, s, true)); //0
19             Console.WriteLine("------------------------");
20 
21             String t = "bc";
22             String s4 = "a" + t;
23             Console.WriteLine("s1==s4 ? " + (s1 == s4)); //true
24             Console.WriteLine("s1.equals(s4) ? " + s1.Equals(s4)); //true
25             Console.WriteLine("String.Compare(s4, s, true) ? " + String.Compare(s4, s, true)); //0
26             Console.WriteLine("------------------------");
27 
28             String s5 = "a" + "bc";
29             Console.WriteLine("s1==s5 ? " + (s1 == s5)); //true
30             Console.WriteLine("s1.equals(s5) ? " + s1.Equals(s5)); //true
31             Console.WriteLine("String.Compare(s5, s, true) ? " + String.Compare(s5, s, true)); //0
32            Console.Read();
33       }

從執行結果可以看出,無論你怎麼折騰,只要二個字串的內容完全相同,引用始終只有一個。

 

java中其實也有類似的機制,稱為“字串常量池”,但是java中卻允許 用new String(String str)的方式建立多個相同內容的例項。為了能區別這二種情況,java中的==與equals用來判斷字串是否相等時,賦予了不同的含義。

==用於判定二個字串是否引用相同,而equals用於判斷二個字串是否內容相同:

 1 public static void testString(){
 2         String s = "Abc";
 3         String s1 = "abc";
 4         String s2 = "abc";
 5         
 6         System.out.println("s1==s2 ? " + (s1==s2)); //true
 7         System.out.println("s1.equals(s2) ? " + s1.equals(s2)); //true
 8         System.out.println("s1.equalsIgnoreCase(s) ? " + s1.equalsIgnoreCase(s)); //true
 9         System.out.println("------------------------");
10         
11         String s3 = new String("abc"); 
12         System.out.println("s1==s3 ? " + (s1==s3)); //false
13         System.out.println("s1.equals(s3) ? " + s1.equals(s3)); //true    
14         System.out.println("s3.equalsIgnoreCase(s) ? " + s3.equalsIgnoreCase(s)); //true
15         System.out.println("------------------------");
16         
17         char[] chr ={'a','b','c'};
18         String s4 = new String(chr);
19         System.out.println("s1==s4 ? " + (s1==s4)); //false
20         System.out.println("s1.equals(s4) ? " + s1.equals(s4)); //true
21         System.out.println("s4.equalsIgnoreCase(s) ? " + s4.equalsIgnoreCase(s)); //true
22         System.out.println("------------------------");
23         
24         String t ="bc";
25         String s5 = "a" + t;
26         System.out.println("s1==s5 ? " + (s1==s5)); //false
27         System.out.println("s1.equals(s5) ? " + s1.equals(s5)); //true
28         System.out.println("s5.equalsIgnoreCase(s) ? " + s5.equalsIgnoreCase(s)); //true
29         System.out.println("------------------------");
30         
31         String s6 = "a" + "bc";
32         System.out.println("s1==s6 ? " + (s1==s6)); //true
33         System.out.println("s1.equals(s6) ? " + s1.equals(s6)); //true
34         System.out.println("s6.equalsIgnoreCase(s) ? " + s6.equalsIgnoreCase(s)); //true
35         
36         
37     }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4662/viewspace-2800412/,如需轉載,請註明出處,否則將追究法律責任。

相關文章