14

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

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

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

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

有人可以解释为什么第一种情况不起作用吗?

4

6 回答 6

31

通过设计,每个变量“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 = "_";
}
于 2009-02-26T06:57:56.353 回答
9

原始代码:

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%)。

于 2009-02-26T07:05:38.830 回答
4

因为x是引用(或引用类型的变量)。第一段代码所做的就是将引用重新指向一个新值。例如

String y = "Jim";
String x = y;
y = "Bob";
System.out.println(x); //prints Jim
System.out.println(y); //prints Bob

您将引用重新分配y给“Bob”这一事实不会影响引用x的分配对象。

于 2009-02-26T06:59:54.117 回答
-1

您可以将数组转换为 List,然后像这样迭代:

String[] currentState = new String[answer.length()];
List<String> list = Arrays.asList(currentState);
for(String string : list) {
   x = "_";     
}
于 2009-02-26T08:35:53.950 回答
-1

Object x[]={1,"ram",30000f,35,"account"}; for(Object i:x) System.out.println(i); for each is used for sequential access

于 2009-05-28T01:45:58.497 回答
-1

for each 循环意味着:

List suits = ...;
List ranks = ...;
List sortedDeck = new ArrayList();
for (Suit suit : suits){
    for (Rank rank : ranks)
        sortedDeck.add(new Card(suit, rank));
}

所以考虑上面你可以这样做:

String[] currentState = new String[answer.length()];
List<String> buffList = new ArrayList<>();
for (String x : currentState){
        x = "_";
        buffList.add(x);
        // buffList.add(x = "_" ); will be work too
}
currentState = buffList.toArray(currentState);
于 2015-10-12T18:34:25.727 回答