2011-11-05 73 views
1

可能重複:
How do I compare strings in Java?Java中的字符串比較...?

爲什麼第一比較(S1 == S2)顯示相等,而第二比較(S1 == S3)顯示不等於....?

public class StringComparison 
    { 

     public static void main(String [] args) 
     { 
       String s1 = "Arsalan"; 
       String s2 = "Arsalan"; 

       String s3 = new String ("Arsalan"); 

       if (s1 == s2) 
       System.out.println (" S1 and S2 Both are equal..."); 
       else 
       System.out.println ("S1 and S2 not equal"); 

       if (s1 == s3) 
       System.out.println (" S1 and S3 Both are equal..."); 
       else 
       System.out.println (" S1 and S3 are not equal"); 

     } 
    } 

回答

11

這是與事實,你不能比較==字符串以及編譯器優化做。

==在Java中僅如果雙方指的是同一個對象完全相同的情況下進行比較。它不會比較內容。要比較字符串的實際內容,您需要使用s1.equals(s2)

現在爲什麼s1 == s2是真實的,s1 == s3是假的原因是因爲JVM決定對代碼進行優化,使s1s2是同一個對象。 (這就是所謂的「字符串池」)。


每3.10.5:字符串文字的池實際上是由標準的規定。

此外,字符串文字總是指類 字符串的相同實例。這是因爲字符串文字 - 或者更一般地說是字符串 是常量表達式(§15.28)的值 - 被「實施」爲 ,以便使用方法String.intern共享唯一實例。

+0

謝謝......現在,在閱讀String Pooling之後,我很清楚......! – Arsalan

4

不要使用==比較字符串,它測試引用相等(做兩個名字指的是同一個對象)。嘗試s1.equals(s2);,它實際上測試元素的相等性。

+0

是的,你是正確的,但我只是想知道這背後的原因.....? – Arsalan

+0

@Arsalan由於s1和s2具有相同的內容,他們可以共享對象以節省空間; Java中的對象儘可能共享 – manuzhang

0

請勿使用==,請使用s1.equals(s2)s1.equals(s3)

0
public class StringComparison 
{ 

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

      String s3 = new String ("Arsalan"); 

      if (s1 == s2) 
      System.out.println (" S1 and S2 Both are equal..."); 
      else 
      System.out.println ("S1 and S2 not equal"); 

      if (s1 == s3) 
      System.out.println (" S1 and S3 Both are equal..."); 
      else 
      System.out.println (" S1 and S3 are not equal"); 

      if (s2 == s3) 
      System.out.println (" S2 and S3 Both are equal..."); 
      else 
      System.out.println (" S2 and S3 are not equal"); 

    } 
} 

如果你運行它,你可以看到,S2和S3也是不相等的。這是因爲s2,s3是對String對象的引用,因此它們包含不同的地址值。

+0

's1'也是對'String'對象的引用。 –

1
String one = "Arsalan"; 
String two = "Arsalan"; 
  1. 一個== 2

    //因爲在存儲器中兩個串都指向同一個對象

  2. one.equals(二)

    ,則返回true //總會返回true,因爲字符串的VALUES是相同的(如果對象的引用不同,則無關緊要)。

1

原因是string interning。這很複雜。編譯器對於s1和s2使用相同的精確對象「足夠聰明」,即使您可能認爲它們不同。但s3,它使用new String("Arsalan"),不實習。

一些準則:

  1. 你應該總是使用equals()方法,而不是==比較字符串
  2. 你應該幾乎從來不使用String s = new String("foo")。 而是使用String s = "foo"
1

如果在字符串池中找不到「Arsalan」,則會創建一個「Arsalan」字符串,並且s1將引用它。由於字符串池中已存在「Arsalan」字符串,因此s2將引用與s1相同的對象。由於new關鍵字用於s3,因此Java將在普通(非池)內存中創建一個新的String對象,並且s3將引用它。這就是爲什麼s1和s3不指向同一個對象的原因。