如果语句与string比较失败

我真的不知道为什么下面的if语句没有执行:

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

下面是全class。

这可能是一个非常愚蠢的逻辑问题,但我已经把我的头发放在这里,无法弄清楚这一点。

感谢您的期待:)

 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"); } } } } } 

在你的例子中,你是比较string对象,而不是他们的内容。

你的比较应该是:

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

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

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

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

Java中有很多string比较。

 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> 

java中的String是对象,所以当与==比较的时候,你是比较引用而不是值。 正确的方法是使用equals()

但是,有一种方法。 如果要使用==运算符比较String对象,则可以使用JVM对string进行处理的方式。 例如:

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

b会是true 。 为什么?

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

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

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

因此,对于任何两个strings和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真。

如果你用C ++和Java编写代码,最好记住在C ++中,string类有==操作符重载。 但在Java中不是这样。 你需要使用equals()equalsIgnoreCase()

你不应该用==来做string比较。 该运算符只会检查是否是相同的实例,而不是相同的值。 使用.equals方法检查相同的值。

您可以使用

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

要么

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

后者进行字典对比,如果两个string相同,则返回0。