Artigo original escrito por: Thanoshan MV
Artigo original: Java Array Methods – How to Print an Array in Java
Traduzido e adaptado por: Daniel Rosa

Um array é uma estrutura de dados usada para armazenar dados do mesmo tipo. Os arrays armazenam seus elementos em localizações sequenciais contínuas da memória.

Em Java, arrays são objetos. Todos os métodos da classe Object podem ser invocados em um array. Podemos armazenar um número fixo de elementos em um array.

Vamos declarar um array simples de tipo primitivo:

int[] intArray = {2,5,46,12,34};

Agora, vamos tentar imprimi-lo com o método System.out.println():

System.out.println(intArray);
// Resultado: [I@74a14482

Por que o Java não imprimiu o array? O que está acontecendo internamente?

O método System.out.println() converte o objeto que passamos em uma string, chamando String.valueOf(). Se olharmos a implementação do método String.valueOf(), veremos o seguinte:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Se o objeto passado para o método for null, ele retorna "null"; caso contrário, é chamado o método obj.toString(). No fim, System.out.println() chama toString() para imprimir o resultado.

Se essa classe de objeto não sobrescrever a implementação de Object.toString(), será chamado o método Object.toString().

Object.toString() retorna getClass().getName()+‘@’+Integer.toHexString(hashCode()). Simplificando, o que ele faz é retornar "nome da classe @ hash code do objeto".

Em nosso resultado anterior, [I@74a14482, o colchete inicial ([) declara que esse objeto é um array, enquanto I representa int (o tipo do array). 74a14482 é a representação hexadecimal sem sinal do hash code do array.

Sempre que criarmos nossas próprias classes personalizadas, é uma prática recomendada sobrescrever o método Object.toString().

Não podemos imprimir arrays em Java usando um método System.out.println() simples. Em vez disso, aqui temos algumas maneiras de podermos imprimir arrays:

  1. Laços: laço for e laço for-each
  2. Método Arrays.toString()
  3. Método Arrays.deepToString()
  4. Método Arrays.asList()
  5. Interface Iterator do Java
  6. Stream API do Java

Vejamos um por um.

1. Laços: laço for e laço for-each

Aqui temos um exemplo de laço for:

int[] intArray = {2,5,46,12,34};

for(int i=0; i<intArray.length; i++){
    System.out.print(intArray[i]);
    // Resultado: 25461234
}

Todas as classes wrapper sobrescrevem o método Object.toString() e retornam uma representação de string de seu valor.

Aqui temos um laço for-each:

int[] intArray = {2,5,46,12,34};

for(int i: intArray){
    System.out.print(i);
    // Resultado: 25461234
}

2. Método Arrays.toString()

Arrays.toString() é um método estático da classe array que pertence ao pacote java.util. Ele retorna uma representação de string do conteúdo do array especificado. Podemos imprimir arrays unidimensionais usando esse método.

Os elementos do array são convertidos em strings usando o método String.valueOf(), assim:

int[] intArray = {2,5,46,12,34};
System.out.println(Arrays.toString(intArray));
// Resultado: [2, 5, 46, 12, 34]

Para um array com um tipo de referência, temos de nos certificar que a classe do tipo de referência sobrescreve o método Object.toString().

Por exemplo:

public class Test {
    public static void main(String[] args) {
        Student[] students = {new Student("John"), new Student("Doe")};
        
        System.out.println(Arrays.toString(students));
        // Resultado: [Student{name='John'}, Student{name='Doe'}]
    }
}

class Student {
    private String name;

    public Student(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + '}';
    }
}

Esse método não é adequado para métodos multidimensionais. Ele converte arrays multidimensionais em strings usando Object.toString(), o que descreve suas identidades, em vez de seu conteúdo.

Por exemplo:

// Criação de um array multidimensional
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.toString(multiDimensionalArr));
// Resultado: [[I@74a14482, [I@1540e19d]

Com a ajuda de Arrays.deepToString(), podemos imprimir arrays multidimensionais.

3. Método Arrays.deepToString()

Arrays.deepToString() retorna uma representação de string do "conteúdo interno" do array especificado.

Se o elemento de um array for de um tipo primitivo, ele será convertido em uma string invocando a sobrecarga apropriada de Arrays.toString() .

Aqui temos um exemplo de array multidimensional de um tipo primitivo:

// Criação de um array multidimensional
int[][] multiDimensionalArr = { {2,3}, {5,9} };

System.out.println(Arrays.deepToString(multiDimensionalArr));
// Resultado: [[2, 3], [5, 9]]

Se o elemento de um array for de tipo de referência, ele será convertido em uma string invocando Arrays.deepToString() recursivamente.

Teacher[][] teachers = 
{{ new Teacher("John"), new Teacher("David") }, {new Teacher("Mary")} };

System.out.println(Arrays.deepToString(teachers));
// Resultado: 
[[Teacher{name='John'}, Teacher{name='David'}],[Teacher{name='Mary'}]]

Temos de sobrescrever Object.toString() em nossa classe Teacher.

Se estiver curioso sobre como é feita a recursão, aqui está o código-fonte do método Arrays.deepToString().

OBSERVAÇÃO: arrays unidimensionais de tipo de referência também podem ser impressos usando este método. Por exemplo:

Integer[] oneDimensionalArr = {1,4,7};

System.out.println(Arrays.deepToString(oneDimensionalArr));
// Resultado: [1, 4, 7]

4. Método Arrays.asList()

Este método retorna uma lista de tamanho fixo gerada pelo array especificado.

Integer[] intArray = {2,5,46,12,34};

System.out.println(Arrays.asList(intArray));
// Resultado: [2, 5, 46, 12, 34]

Alteramos o tipo para Integer a partir de int, pois List é uma coleção que suporta uma lista de objetos apenas. Quando convertemos um array em uma lista, ele deve ser um array de tipo de referência.

O Java chama Arrays.asList(intArray).toString(). Essa técnica usa internamente o método toString() do tipo dos elementos que está dentro da lista.

Outro exemplo com nossa classe personalizada Teacher:

Teacher[] teacher = { new Teacher("John"), new Teacher("Mary") };

System.out.println(Arrays.asList(teacher));
// Resultado: [Teacher{name='John'}, Teacher{name='Mary'}]

OBSERVAÇÃO: não podemos imprimir arrays multidimensionais usando esse método. Por exemplo:

Teacher[][] teachers = 
{{ new Teacher("John"), new Teacher("David") }, { new Teacher("Mary") }};
        
System.out.println(Arrays.asList(teachers));

// Resultado: [[Lcom.thano.article.printarray.Teacher;@1540e19d, [Lcom.thano.article.printarray.Teacher;@677327b6]

5. Interface Iterator do Java

Da mesma forma que em um laço for-each, podemos usar a interface Iterator para percorrer elementos do array e imprimi-los.

O objeto Iterator pode ser criado invocando o método iterator() em uma coleção. Esse objeto será usado para iterar sobre os elementos daquela coleção.

Aqui temos um exemplo de como podemos imprimir um array usando a interface Iterator:

Integer[] intArray = {2,5,46,12,34};

// Criação de uma lista de Integer
List<Integer> list = Arrays.asList(intArray);

// Criação de um iterator da lista de Integer
Iterator<Integer> it = list.iterator();

// Se a lista tiver elementos que possam ser percorridos pelo Iterator
while(it.hasNext()) {
    System.out.print(it.next());
    // Resultado: 25461234
}

6. Stream API do Java

A Stream API é usada para processar coleções de objetos. Uma stream é uma sequência de objetos. Streams não mudam a estrutura de dados original. Elas apenas fornecem o resultado de acordo com as operações solicitadas.

Com o auxílio da operação terminal forEach(), podemos percorrer cada elemento da stream por iteração.

Por exemplo:

Integer[] intArray = {2,5,46,12,34};

Arrays.stream(intArray).forEach(System.out::print);
// Resultado: 25461234

Agora, você já sabe como imprimir um array em Java.

Obrigado pela leitura.

A imagem de capa é de Aziz Acharki e retirada do Unsplash.

Você pode ler outros artigos do autor no Medium e no freeCodeCamp (em inglês).

Boa programação para você!