当我使用此代码时:
Scanner scan = new Scanner(System.in);
String codeEntered = "";
for ( ; ; ){
System.out.print("Enter Code or Press Q to Quit:\n");
codeEntered = scan.nextLine();
if (codeEntered == "Q"){
break;
}
//Do stuff here.
}
System.out.println("Goodbye!");
即使输入“Q”,我也无法摆脱for循环。这段代码有什么问题?
答案 0 :(得分:8)
if (codeEntered == "Q"){
比较对象时,通常应使用equals()
而不是operator==
。 (而String
是一个对象!)
operator==
检查身份 - 如果两个操作数相同的对象,而equals()
检查其内容是否等于彼此。
尝试:
if ("Q".equals(codeEntered)){
答案 1 :(得分:3)
不要使用==
比较字符串。请改用equals(...)
或equalsIgnoreCase(...)
方法。理解==检查两个对象是否相同而不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,并且这才是最重要的。而不是
if (fu == "bar") {
// do something
}
做,
if ("bar".equals(fu)) {
// do something
}
,或者
if ("bar".equalsIgnoreCase(fu)) {
// do something
}
答案 2 :(得分:2)
您的问题是您使用双等于==
来比较字符串。
试试这个
if(codeEntered.equals("Q")) {
break;
}
==
比较内存中的地址,这对于字符串来说永远不会相同。在Java中进行字符串比较时,应始终使用.equals。
答案 3 :(得分:2)
使用equals()
方法。
if (codeEntered.equals("Q")){
break;
}
equals()
方法比较String对象中的字符。 ==
运算符比较两个对象引用以查看它们是否引用同一实例。
例如,
String hello = new String("hello");
在这种情况下, hello
创建一个合并的实例(请参阅intern),new String(...)
创建一个非池化的实例。
尝试System.out.println(("hello" == "hello") + "," + (new String("hello") == "hello") + "," + (new String("hello") == new String("hello")));
您应该看到true,false,false
new String("hello");
(如上例所示)
并没有真正做任何有用的事情。它只是创建另一个由相同数组,偏移量和长度作为s支持的实例。很少有理由这样做,因此被大多数Java程序员认为是不好的做法。
答案 4 :(得分:2)
应始终使用equals
方法和基元与==
比较对象。自定义对象应该实现自己的equals方法来检查对象的相等性。这是拇指规则。