java的比较语句_关于java:如果带有String比较的语句失败

本问题已经有最佳答案,请猛点这里访问。

我真的不知道下面的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");

}

}

}

}

}

太糟糕了,我们不能给+1进行编辑。

=means;这是同一个对象吗?它与包含相同数据的对象不匹配。

为什么它被标记为"多线程"?

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

你的比较应该是:

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

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

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

我更喜欢S.equals("/quit")。这是美容,但我想有重要的当前数据,以便于看到。

s.equales("/quit")将引发nullpointerException is s is null,"/quit"。equals(s)将永远不会引发NPE

因此,"退出"。等于将在s无意中为空的情况下隐藏错误。

@Starblue很好,总是需要考虑的事情

好吧,还有一个让它s.equals()的原因。可能依赖于代码,但NPE是保持当前上下文处于最前面的一个原因。

@Renes无论字符串/上下文是什么,我仍然会执行""。equals(s)for I knowwill not be null which s may.但是如果s等于(s2),那么你是对的,但是你必须用if(s)包围它。=空)块。

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

在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>

检查参考是否相同。

在Java中,EDCOX1的3个s是对象,所以当与EDCOX1(4)比较时,您正在比较引用,而不是值。正确的方法是使用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

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.

如果您在C++和Java中编码,最好记住在C++中,字符串类具有= =运算符重载。但在Java中却不是这样。您需要使用equals()或equalsIgnoreCase()来实现这一点。

你可以用

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

...

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

...

后者进行词典比较,如果两个字符串相同,则返回0。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值