以下代码没有达到我的预期。此代码执行后,每个字符串都为null。
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] = "_";
}
有人可以解释为什么第一种情况不起作用吗?
答案 0 :(得分: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 = "_";
}
答案 1 :(得分: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
}
当您执行此类操作时,使变量最终突出显示(这是一个常见的初学者错误)。尝试将所有变量设为final(实例,类,参数,catch中的异常等等) - 只有在真正需要更改它们时才使它们成为非final。您应该会发现90%-95%的变量是最终变量(初学者在开始这样做时最终会达到20%-50%)。
答案 2 :(得分: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
的分配。
答案 3 :(得分:-1)
您可以将数组转换为List,然后像这样迭代:
String[] currentState = new String[answer.length()];
List<String> list = Arrays.asList(currentState);
for(String string : list) {
x = "_";
}
答案 4 :(得分:-1)
对象x [] = {1,“ram”,30000f,35,“account”}; for(Object i:x) 的System.out.println(ⅰ); for each用于顺序访问
答案 5 :(得分:-1)
对于每个循环意味着:
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);