java if语句不破坏;for loop";
我是java的新手,但我认为我在这几周的自学中做得很好。但现在我陷入了这个循环 这是我的一个班级的一个方法。为了帮助我调试,我在这个方法中添加了“myString”字符串和“syntax”列表,以演示正在发生的事情,并保持它的简单性,至少现在是这样java if语句不破坏;for loop";,java,if-statement,for-loop,indexing,break,Java,If Statement,For Loop,Indexing,Break,我是java的新手,但我认为我在这几周的自学中做得很好。但现在我陷入了这个循环 这是我的一个班级的一个方法。为了帮助我调试,我在这个方法中添加了“myString”字符串和“syntax”列表,以演示正在发生的事情,并保持它的简单性,至少现在是这样 public void getIndex(){ String myString = "2 2 + 3 5"; String[] syntax = myString.split(" "); for (int index = 0
public void getIndex(){
String myString = "2 2 + 3 5";
String[] syntax = myString.split(" ");
for (int index = 0; index < syntax.length; index++){
System.out.println("current index is: " + index);
System.out.println("It has: " + syntax[index]);
// these print statements are made to help me debug
if (syntax[index] == "+"){
indexNeeded = index;
break;
}
}
System.out.println("Index Needed: " + indexNeeded);
循环在找到“+”时应该停止,但似乎“if语句”根本不起作用,因此“indexNeeded”没有改变。
这是一个简单的方法,但我在这里做错了什么?您试图将字符串与
==
进行比较。这不起作用,您需要使用.equals()
:
更改:
syntax[index] == "+"
到
=
仅当两个对象引用同一实例时才返回true<当字符串的内容相同时,code>equals()将返回true。这就是你想要的。你应该写:
syntax[index].equals("+")
“+”
是对字符串的引用,语法[index]
是另一个。但在这里,您希望比较对象本身,而不是它们的引用
如果您选取两个对象a
和b
,无论是哪一类对象,a==b
将测试引用是否相同。测试它们是否“相同”将写入a.equals(b)
您应该仔细阅读Java,它是理解的基础部分。对于字符串,您需要
syntax[index].equals("+")
替换
if (syntax[index] == "+"){
与
当您尝试==
时,它比较引用,并且syntex[index]
没有引用与literal“+”
所在的位置不相同。所以他们是不平等的
// If syntax[index] get '+' value from somewhere but not literal
if(syntax[index] == "+" ) // is false
// right way is
if(syntax[index].equals("+")) // is true
// If syntax[index] get '+' value from literal
syntax[index] = "+";
if(syntax[index] == "+" ) // is true
// This approach is faster but has mentioned above has limitations.
当您使用equals时,它实际上会比较内容。如果要比较字符串的值,则需要使用。equals(),但如果要比较引用,则使用运算符==。这是新手常犯的错误 花一分钟时间看看以下两者之间的区别:
syntax[index] == "+"
及
在Java中,语法[index]中不允许可能的空指针的顺序有两种形式 相等运算符“==”检查两个变量是否引用同一对象。在您的例子中,此测试失败,因为尽管它们的内容相同,但您引用的是两个不同的字符串对象
.equals()
方法可用于每个Java对象,并提供可扩展的相等性检查。在字符串的情况下,考虑以下内容:
"+".equals("+") // evaluates to true
返回相等运算符:
"+" == "+" // evaluates to false
有关更多详细信息,请参阅。这里有一个有趣的、有教育意义的方法来解决您的问题。向方法添加对的调用,它将正常工作。让你的朋友们大吃一惊!:)
public int getIndex()
{
字符串myString=“2+3 5”;
字符串[]语法=myString.split(“”);
int indexNeeded=-1;
for(int index=0;index
请注意,从方法返回值比使用具有类范围的变量要好。类作用域变量应该为可以被视为对象属性的数据保留
IndexRequired
不符合该描述,对于int
,它是一个糟糕的名称-听起来它应该是一个布尔值
使用return;而不是休息;
这对我很有用这是关于字符串和字符的平等性测试。与
if
或break
无关。你真的需要得到一个更好的教程,一个更全面地涵盖字符串相等性检查的教程。@S.Lott——这是一个很容易犯的错误,即使你对这个主题相当熟悉。对于新手来说很有可能,不管他们是否听过关于字符串比较的讲座。@HotLicks:从来没有说过这不容易。但“我认为我自学得很好”表明需要更好的指导。是的,但这是你在实践中学习的东西——犯了2-3次错误后,你有点“明白了”(*)——比你只听讲座要好得多。(*)(尽管在这一点上反复出现的情况非常普遍,即使对于那些已经编程几十年的人来说也是如此。)那么你犯了多少次错误??(现在老实说!)-1,因为“+”=“+”
的计算结果为true。您需要研究Java如何处理String
s。我发现这个答案很有启发性:基本上,您是对的,但这只是因为JVM进行了优化。区别在于何时何地构造字符串。字符串不能保证运算符相等。我应该补充一点,这种优化在规范中,但在Oracle JVM之外不能保证。OpenJDK、IBM JDK和其他用户可能会看到不同的结果。@jbchichoko,字符串在Java中是独特而棘手的,因为有时候==可以很好地处理字符串,这是因为Java内部处理字符串的方式。您仍然应该始终使用equals
,但是。==用于测试两个对象引用(内存位置)是否相同。equals用于测试对象的相等性。对于对象,即使它们的属性都相等,它们也可以具有不同的引用。就字符串而言,即使所有字符都是相同的,它们也可能指的是不同的内存位置。是的,我知道-你的答案说“for String”,而实际上它适用于所有对象。他对break没有问题,但与它相关的if语句有问题。我的英语很差,我读得不好,我认为休息对他不起作用,因为我在搜索中输入了这个,找到了这个,我是一个新手
syntax[index] == "+"
"+".equals(syntax[index])
"+".equals("+") // evaluates to true
"+" == "+" // evaluates to false
public int getIndex()
{
String myString = "2 2 + 3 5";
String[] syntax = myString.split(" ");
int indexNeeded = -1;
for (int index = 0; index < syntax.length; index++)
{
System.out.println("current index is: " + index);
System.out.println("It has: " + syntax[index]);
// these print statements are made to help me debug
if (syntax[index].intern() == "+")
{
indexNeeded = index;
break;
}
}
return indexNeeded;
}