了解 Java 中的每个循环

2022-09-03 17:02:31

下面的代码没有达到我的预期。此代码执行后,每个字符串都为 null。

String[] currentState = new String[answer.length()];
for(String x : currentState)
{
    x = "_";
}

下面的代码符合我的预期。当前状态中的每个字符串现在都是“_”

String[] currentState = new String[answer.length()];
for (int i = 0; i < currentState.length; i++) {
    currentState[i] = "_";
}

有人能解释为什么第一个案例不起作用吗?


答案 1

根据设计,对于每个变量“x”(在本例中)并不意味着要分配给。我很惊讶它甚至编译得很好。

String[] currentState = new String[answer.length()]; 
for (String x : currentState) { 
    x = "_"; // x is not a reference to some element of currentState 
}

下面的代码可能显示了您实际上正在执行的操作。请注意,这不是枚举的工作方式,但它说明了为什么不能分配“x”。它是位置“i”处的元素的副本。(编辑:请注意,该元素是引用类型,因此它是该引用的副本,分配给该副本不会更新相同的内存位置,即位置“i”处的元素)

String[] currentState = new String[answer.length()]; 
for (int i = 0; i < answer.length(); i++) { 
    String x = currentState[i];
    x = "_";
}

答案 2

原始代码:

String currentState = new String[answer.length()];

for(String x : currentState) 
{ 
    x = "_"; 
}

重写的代码:

String currentState = new String[answer.length()];

for(int i = 0; i < currentState.length; i++) 
{ 
    String x;

    x = currentState[i];
    x = "_"; 
}

我将如何编写代码:

String currentState = new String[answer.length()];

for(final String x : currentState) 
{ 
    x = "_";   // compiler error
}

重写了代码,但出现错误:

String currentState = new String[answer.length()];

for(int i = 0; i < currentState.length; i++) 
{ 
    final String x;

    x = currentState[i];
    x = "_";   // compiler error
}

当您执行此类操作时,使变量成为最终亮点(这是一个常见的初学者错误)。尝试使所有变量(实例,类,参数,catch中的异常等)成为最终变量 - 只有在您确实必须更改它们时才使它们成为非最终变量。你应该发现90%-95%的变量是最终的(初学者在开始这样做时会得到20%-50%的变量)。