2011-11-05 41 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不指向同一个对象的原因。