Понимание для каждого цикла в Java
Код ниже не делает того, что я ожидаю. Каждая строка имеет значение 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] = "_";
}
Может кто-нибудь объяснить, почему первый случай не работает?
Ответы
Ответ 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%, когда они начнут делать это).
Ответ 3
Потому что x
является ссылкой (или переменной ссылочного типа). Вся первая часть кода повторяет ссылку на новое значение. Например
String y = "Jim";
String x = y;
y = "Bob";
System.out.println(x); //prints Jim
System.out.println(y); //prints Bob
Тот факт, что вы переназначаете ссылку y
на "Боб", не влияет на то, на что была назначена ссылка x
.
Ответ 4
Вы можете преобразовать свой массив в список и затем повторить так:
String[] currentState = new String[answer.length()];
List<String> list = Arrays.asList(currentState);
for(String string : list) {
x = "_";
}
Ответ 5
Объект x [] = {1, "ram", 30000f, 35, "account" }; для (Object i: x) System.out.println(я);
для каждого используется для последовательного доступа
Ответ 6
Для каждого цикла для этого:
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);