Uma matriz é uma estrutura de dados usada para armazenar dados do mesmo tipo. As matrizes armazenam seus elementos em locais de memória contíguos.

Em Java, matrizes são objetos. Todos os métodos do objeto de classe podem ser chamados em uma matriz. Podemos armazenar um número fixo de elementos em uma matriz.

Vamos declarar um tipo primitivo simples de matriz:

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

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

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

Por que o Java não imprimiu nossa matriz? O que está acontecendo sob o capô?

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

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

Se o objeto passado for null retorna nulo, senão chama obj.toString() . Eventualmente, System.out.println() chamadas toString() para imprimir a saída.

Se a classe desse objeto não substituir Object.toString()implementação, chamará o Object.toString() método.

Object.toString() retorna getClass().getName()+‘@’+Integer.toHexString(hashCode()) . Em termos simples, ele retorna: “nome da classe @ código hash do objeto”.

Em nossa saída anterior [I@74a14482 , a [ afirma que esta é uma matriz e I significa int (o tipo da matriz). 74a14482 é a representação hexadecimal não assinada do código hash da matriz.

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

Não podemos imprimir matrizes em Java usando um simples System.out.println() método. Em vez disso, estas são as seguintes maneiras pelas quais podemos imprimir uma matriz:

  1. Loops: para loop e para cada loop
  2. Arrays.toString() método
  3. Arrays.deepToString() método
  4. Arrays.asList() método
  5. Interface Java Iterator
  6. API de fluxo Java

Vamos vê-los um por um.

Aqui está um exemplo de um loop for:

int[] intArray = {2,5,46,12,34};for(int i=0; i

Todas as classes de wrapper substituem Object.toString() e retorne uma representação de string de seu valor.

E aqui está um loop for-each:

int[] intArray = {2,5,46,12,34};for(int i: intArray){    System.out.print(i);    // output: 25461234}

Arrays.toString() é um método estático da classe array que pertence ao java.util pacote. Retorna uma representação em cadeia do conteúdo da matriz especificada. Podemos imprimir matrizes unidimensionais usando esse método.

Os elementos da matriz são convertidos em cadeias usando o método String.valueOf() método, como este:

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

Para um tipo de referência de matriz, precisamos garantir que a classe de tipo de referência substitua a Object.toString() método.

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));        // output: [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 + "'' + '}';    }}

Este método não é apropriado para matrizes multidimensionais. Ele converte matrizes multidimensionais em strings usando Object.toString() que descreve suas identidades e não seu conteúdo.

Por exemplo:

// creating multidimensional arrayint[][] multiDimensionalArr = { {2,3}, {5,9} };System.out.println(Arrays.toString(multiDimensionalArr));// output: [[I@74a14482, [I@1540e19d]

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

Arrays.deepToString() retorna uma representação de string do "conteúdo profundo" da matriz especificada.

Se um elemento for uma matriz do tipo primitivo, ele será convertido em uma sequência de caracteres, invocando a sobrecarga apropriada de Arrays.toString() .

Aqui está um exemplo do tipo primitivo de matriz multidimensional:

// creating multidimensional arrayint[][] multiDimensionalArr = { {2,3}, {5,9} };System.out.println(Arrays.deepToString(multiDimensionalArr));// output: [[2, 3], [5, 9]]

Se um elemento for uma matriz do tipo de referência, ele será convertido em uma string chamando Arrays.deepToString() recursivamente.

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

Temos que substituir Object.toString() na nossa turma de professores.

Se você está curioso para saber como ocorre a recursão, aqui está o Código fonte para o Arrays.deepToString() método.

NOTA: As matrizes unidimensionais do tipo de referência também podem ser impressas usando esse método. Por exemplo:

Integer[] oneDimensionalArr = {1,4,7};System.out.println(Arrays.deepToString(oneDimensionalArr));// output: [1, 4, 7]

Este método retorna uma lista de tamanho fixo apoiada pela matriz especificada.

Integer[] intArray = {2,5,46,12,34};System.out.println(Arrays.asList(intArray));// output: [2, 5, 46, 12, 34]

Alteramos o tipo para Inteiro de int, porque List é uma coleção que contém uma lista de objetos. Quando estamos convertendo uma matriz em uma lista, ela deve ser uma matriz do tipo de referência.

Chamadas Java Arrays.asList(intArray).toString() . Essa técnica usa internamente o toString() método do tipo dos elementos na lista.

Outro exemplo com nossa classe personalizada de professor:

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

NOTA: Não podemos imprimir matrizes multidimensionais usando esse método. Por exemplo:

Teacher[][] teachers = {{ new Teacher("John"), new Teacher("David") }, { new Teacher("Mary") }};        System.out.println(Arrays.asList(teachers));// output: [[Lcom.thano.article.printarray.Teacher;@1540e19d, [Lcom.thano.article.printarray.Teacher;@677327b6]

Semelhante a um loop for-each, podemos usar a interface Iterator para percorrer os elementos da matriz e imprimi-los.

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

Aqui está um exemplo de como podemos imprimir uma matriz usando a interface Iterator:

Integer[] intArray = {2,5,46,12,34};// creating a List of IntegerList list = Arrays.asList(intArray);// creating an iterator of Integer ListIterator it = list.iterator();// if List has elements to be iteratedwhile(it.hasNext()) {    System.out.print(it.next());    // output: 25461234}

A API de fluxo é usada para processar coleções de objetos. Um fluxo é uma sequência de objetos. Os fluxos não alteram a estrutura de dados original, eles fornecem apenas o resultado conforme as operações solicitadas.

Com a ajuda do forEach() operação terminal, podemos percorrer todos os elementos do fluxo.

Por exemplo:

Integer[] intArray = {2,5,46,12,34};Arrays.stream(intArray).forEach(System.out::print);// output: 25461234

Agora sabemos como imprimir uma matriz em Java.

Obrigado pela leitura.

Imagem da capa de Aziz Acharki em Unsplash.

Você pode ler meus outros artigos em Médio.

Feliz codificação!



Fonte