45

我真的不知道为什么下面的 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");
                }
            }
        }
    }
}
4

6 回答 6

98

在您的示例中,您正在比较字符串对象,而不是它们的内容。

您的比较应该是:

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

或者如果s字符串 nullity 不介意/或者你真的不喜欢 NPE:

if ("/quit".equals(s))
于 2009-03-18T16:14:59.237 回答
37

要比较字符串是否相等,请不要使用 ====运算符检查两个对象是否完全相同:

Java中有很多字符串比较。

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>
于 2009-03-18T16:21:06.633 回答
12

StringJava 中的 s 是对象,因此与 比较时==,您是在比较引用,而不是值。正确的方法是使用equals().

不过,有办法。如果要String使用运算符比较对象==,可以利用 JVM 处理字符串的方式。例如:

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

b将是true。为什么?

因为 JVM 有一个String常量表。因此,无论何时使用字符串文字(引号"),虚拟机都会返回相同的对象,因此会==返回true.

intern()通过使用该方法,即使是非文字字符串,您也可以使用相同的“表” 。它返回对应于该表中当前字符串值的对象(或将其放在那里,如果不是)。所以:

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

由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。

于 2010-02-14T07:23:57.890 回答
5

You can use

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

or

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

The latter makes a lexicographic comparison, and will return 0 if the two strings are the same.

于 2009-04-14T19:36:18.633 回答
5

您不应该使用 == 进行字符串比较。该运算符只会检查它是否是同一个实例,而不是同一个值。使用 .equals 方法检查相同的值。

于 2009-03-18T16:18:41.243 回答
5

如果您使用 C++ 和 Java 编写代码,最好记住在 C++ 中,字符串类重载了 == 运算符。但在 Java 中并非如此。你需要使用equals()or equalsIgnoreCase()

于 2009-11-23T22:10:24.637 回答