Подтвердить что ты не робот

Понимание для каждого цикла в 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] = "_";
}

Может кто-нибудь объяснить, почему первый случай не работает?

4b9b3361

Ответ 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);