java if语句不破坏;for loop";

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

我是java的新手,但我认为我在这几周的自学中做得很好。但现在我陷入了这个循环

这是我的一个班级的一个方法。为了帮助我调试,我在这个方法中添加了“myString”字符串和“syntax”列表,以演示正在发生的事情,并保持它的简单性,至少现在是这样

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