2009-03-18 38 views
40

を失敗した場合、私は本当に、以下のif文が実行されていない理由を知っていない: 文字列の比較と文は

if (s == "/quit") 
{ 
    System.out.println("quitted"); 
} 

以下は全体のクラスです。

これはおそらく本当に愚かなロジックの問題ですが、私はここでこれを理解することができずに私の髪を引き出しています。探しているため

感謝:)あなたの例では

class TextParser extends Thread { 
    public void run() { 
     while (true) { 
      for(int i = 0; i < connectionList.size(); i++) { 
       try {    
        System.out.println("reading " + i); 
        Connection c = connectionList.elementAt(i); 
        Thread.sleep(200); 

        System.out.println("reading " + i); 

        String s = ""; 

        if (c.in.ready() == true) { 
         s = c.in.readLine(); 
         //System.out.println(i + "> "+ s); 

         if (s == "/quit") { 
          System.out.println("quitted"); 
         } 

         if(! s.equals("")) { 
          for(int j = 0; j < connectionList.size(); j++) { 
           Connection c2 = connectionList.elementAt(j); 
           c2.out.println(s); 
          } 
         } 
        } 
       } catch(Exception e){ 
        System.out.println("reading error"); 
       } 
      } 
     } 
    } 
} 
+2

私たちは編集に+1を与えることはできません。 –

+0

==手段;これは同じオブジェクトです。同じデータを含むオブジェクトは一致しません。 –

+0

「マルチスレッド」というタグが付いているのはどうですか? – Asaf

答えて

86

は、あなたではなく、その内容、文字列オブジェクトを比較しています。

あなたの比較は次のようになります。

if (s.equals("/quit")) 

またはs文字列NULLかどうかは気にしない/またはあなたが本当にのNPE好きではない場合:

if ("/quit".equals(s)) 
+1

私はs.equals( "/ quit")が好きです。美容的には重要な現在のデータを見やすくしたいと思っています。 – ReneS

+3

s.equales( "/ quit")はNullPointerExceptionをスローします。sはnullです。 "/quit".equals(s)はNPEを投げません – basszero

+7

したがって、" /quit".equals(s)はsが無意識にnullです。 – starblue

3

あなたがして文字列の比較を行うべきではありませんが==。その演算子は、同じ値ではなく、同じインスタンスであるかどうかをチェックするだけです。 .equalsメソッドを使用して、同じ値をチェックします。

30

文字列を同等に比較するには、==を使用しないでください。多くの文字列の比較がある

Javaのでは:2つのオブジェクトがまったく同じオブジェクトである場合に==オペレータかどうかを確認します。

String s = "something", t = "maybe something else"; 
if (s == t)  // Legal, but usually WRONG. 
if (s.equals(t)) // RIGHT 
if (s > t) // ILLEGAL 
if (s.compareTo(t) > 0) // also CORRECT> 
+0

参照が同じであることを確認します。 –

4

あなたは後者がlexicographic比較を行い、2つの文字列が同じであれば0を返します

if("/quit".equals(s)) 
    ... 

または

if("/quit".compareTo(s) == 0) 
    ... 

を使用することができます。

4

C++およびJavaでコードを作成する場合は、C++で文字列クラスに==演算子がオーバーロードされていることを覚えておくとよいでしょう。しかし、Javaではそうではありません。それにはequals()またはequalsIgnoreCase()を使用する必要があります。

11

Stringがオブジェクトであるため、==と比較すると、値ではなく参照が比較されます。正しい方法はequals()です。

しかし、方法があります。 ==演算子を使用してStringオブジェクトを比較する場合は、JVMが文字列に対応する方法を利用できます。たとえば:

String a = "aaa"; 
String b = "aaa"; 
boolean b = a == b; 

btrueだろう。どうして?

JVMには、Stringという定数の表があるためです。したがって、文字列リテラル(引用符")を使用すると、仮想マシンはと同じオブジェクトを返します。したがって、==trueを返します。

intern()メソッドを使用すると、リテラルでない文字列でも同じ "テーブル"を使用できます。現在の文字列値に対応するオブジェクトをそのテーブルから返します(存在しない場合はそこに置きます)。だから、:それは、任意の2つの文字列sとtのため、s.intern()== t.intern()は次の

String a = new String("aa"); 
String b = new String("aa"); 
boolean check1 = a == b; // false 
boolean check1 = a.intern() == b.intern(); // true 

があれば真であるとs.equals(t)がtrueの場合にのみ。