Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Diferença na atribuição de Arrays

Tenho uma dúvida com relação a saída deste programa:

package certificacao;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class TesteArrays{
    public static void main(String... args){
        ArrayList<String> at = new ArrayList<String>();
        at.add("Coca");
        at.add("pepsi");
        at.add("sukita");

        System.out.println("Total do Arrau at::"+at);
        String[] ats1 = new String[at.size()];
        String[] ats2 = at.toArray(ats1);
        System.out.println("ats1 == ats2:"+(ats1==ats2));
        System.out.println("ats1:"+Arrays.toString(ats1));
        System.out.println("ats2:"+Arrays.toString(ats2));

        ats1 = new String[1];
        ats1[0]="Teste Data";
        ats2 = at.toArray(ats1);
        System.out.println("ats1 == ats2:"+(ats1==ats2));
        System.out.println("ats1:"+Arrays.toString(ats1));
        System.out.println("ats2:"+Arrays.toString(ats2));
    }
}

Saída:

Total do Arrau at::[Coca, pepsi, sukita]
ats1 == ats2:true
ats1:[Coca, pepsi, sukita]
ats2:[Coca, pepsi, sukita]
ats1 == ats2:false
ats1:[Teste Data]
ats2:[Coca, pepsi, sukita]

Gostaria de saber por que na primeira comparação do Array de String ats1 e ats2 eu obtenho TRUE e na segunda compração eu obtenho FALSE ?

4 respostas
solução!

Oi Lucas!

O método toArray das coleções vão sempre tentar devolver os elementos na array que você passou como argumento, se houver espaço naquela array para isso.

Da primeira vez, você deu new em uma array de tamanho at.size(), então os 3 elementos cabem e ele utiliza essa mesma array para te devolver a resposta

Da segunda vez, você fez ats1 = new String[1], então quando você pede o toArray(ats1) esses 3 elementos da at (que tem os refrigerantes dentro) não cabem! ele percebe isso e cria uma nova array, de tamanho suficiente, e te devolve, que é uma referência diferente da outra array.

É exatamente o que a API fala nesse trecho: https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#toArray-T:A-

If the collection fits in the specified array, it is returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size of this collection.

Para evitar essas pegadinhas, quando for fazer comparações você deve usar o método equals do teu objeto. :-)

Recomendo não deixar de praticar com o ==. Embora com o equals você "fuja" dessa situação, na prova poderá cair perguntas onde o objetivo é testar justamente esta análise de referência a objetos, continue praticando exercícios e situações com ambos para a prova. Apenas no trabalho no dia-a-dia, ai sim tome cuidado com o uso de ==.

Obrigado Paulo, consegui entender. Caso a Collection caiba no Array, ele retorna a referência deste Array, caso contrário ele cria um novo e retorna, caracterizando uma nova referência.

Esta foi uma questão do simulado whizlabs preparatório para certificação, onde eles cobram este tipo de conhecimento, mas no dia a dia é muito difícil utilizar ==

Obrigado!