如果语句与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。