Duvida em questão de certificação

int []arr = {1,2,3,4};
   for ( int i : arr ) {
        arr[i] = 0;
   }
   for ( int i : arr ) {
        System.out.println(i);
   }

a resposta é:
0
0
3
0

pq???

Teste de Mesa…

1 2 3 4 -> Array inicial

Iterações:
1 0 3 4 -> seta o indice 1, para 0
0 0 3 4 -> seta o indice 0, para 0
0 0 3 0 -> seta o indice 3, para 0
0 0 3 0 -> seta o indice 0, para 0

Sacou?

nao…

hehe, confuso mesmo,

seria o mesmo que fazer isso:

		int[] arr = { 1, 2, 3, 4 };
		for (int i = 0; i < arr.length; i++) {
			arr[arr[i]] = 0;
		}

		for (int i : arr) {
			System.out.println(i);
		}

melhorou?

Piorou…

Pô, o exemplo do cara foi ótimo.
Debuga e acompanha o valor das variáveis…

[quote=Tchulda]Pô, o exemplo do cara foi ótimo.
Debuga e acompanha o valor das variáveis…[/quote]

hehe

olha só… mais mastigado que isso não consigo

	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4 };
		for (int i = 0; i &lt; arr.length; i++) {
			System.out.println(i);
			//está usando os valores do próprio array como indice:
			arr[arr[i]] = 0;
			//primeira passada:
			//i = 0;
			//arr[0] é igual a 1; primeira posição de arr.
			//então arr[1] que era 2 agora passa a ser 0;
			//temos arr = { 1, 0, 3, 4 };
			
			//segunda passada:
			//i = 1;
			//arr[1] é igual a 0; segunda posição de arr.
			//então arr[0] que era 1 agora passa a ser 0;
			//temos arr = { 0, 0, 3, 4 };
			
			//terceira passada:
			//i = 2;
			//arr[2] é igual a 3; terceira posição de arr.
			//então arr[3] que era 4 agora passa a ser 0;
			//temos arr = { 0, 0, 3, 0 };
		}
		System.out.println();
		for (int i : arr) {
			System.out.println(i);
		}

O truque e a confusão é que ele sai alterando o array ao mesmo tempo que o itera. Ele itera o array sequencialmente, mas usa como índices o elemento. Como o g4j mostrou, ele acaba fazendo um arr[arr[i]] = 0.

Isso, num foreach fica mais nebuloso ainda… se tivesse caido essa questão na prova eu tinha errado :oops:

Demorou, mas eu entendi. Valeu.

vi essa questão no Inquisition eu errei :\ mas intendi…
e foda se fosse collection tinha lançado uma ConcurrentModfiicationablablablaException