Menu

Arrays em Java: declarar, inicializar, acessar e percorrer

Como os arrays funcionam em Java: tamanho fixo, como declará-los e inicializá-los, indexação, length, percursos, arrays multidimensionais e a classe utilitária Arrays.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Um array é uma lista de tamanho fixo

Um array em Java guarda um número fixo de valores do mesmo tipo, dispostos em ordem e acessados pela posição. "Fixo" é a palavra-chave: depois que você cria um array, o tamanho dele nunca muda. E "mesmo tipo": um int[] guarda apenas valores int, um String[] guarda apenas strings. Essa rigidez é o preço que se paga para que os arrays sejam rápidos e compactos na memória.

Você declara um tipo de array colocando [] depois do tipo do elemento e, em seguida, atribui um literal ou aloca um com new:

Os colchetes podem ficar depois do tipo (int[] scores) ou depois do nome (int scores[]). Ambos compilam, mas int[] scores é o estilo idiomático de Java - coloque os [] junto ao tipo, onde eles pertencem.

Criando um array com new

Quando você ainda não conhece os valores mas conhece o tamanho, use new. Isso aloca as posições e as preenche com o valor padrão do tipo:

Os valores padrão não são lixo aleatório - Java inicializa cada elemento com zero. Tipos numéricos começam em 0 (ou 0.0), boolean começa em false, e tipos de referência como String começam em null. Vale lembrar desse null: um String[] recém-alocado está cheio de nulls, e chamar um método em um deles lança um NullPointerException.

A indexação começa no zero

Você lê e escreve elementos pelo índice, contando a partir de 0. O último índice válido é sempre length - 1:

Ao contrário dos arrays de algumas linguagens de script, sair do intervalo não devolve silenciosamente null nem undefined - lança uma exceção. Tente ler um índice que não existe:

Esse programa quebra com:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3

Esse é um dos erros mais comuns entre iniciantes. A correção quase sempre é um erro de um a mais (off-by-one) na condição de um laço - usar <= onde você queria <.

length é um campo, não um método

Todo array carrega seu tamanho em um campo length. Atenção: sem parênteses.

Aqui vai uma pegadinha que pega todo mundo pelo menos uma vez: arrays usam .length (um campo), mas String usa .length() (um método). Escrever nums.length() em um array é um erro de compilação, e escrever text.length em uma string também. A mesma palavra, regras diferentes - a do array não tem parênteses.

Percorrendo um array

Você aprendeu o laço for-each na página anterior, e ele é a forma mais limpa de ler cada elemento quando você não precisa do índice:

Quando você precisa do índice - para imprimir números de posição, modificar elementos no lugar ou iterar de trás para frente - recorra ao clássico laço for indexado usando length como limite:

A condição é i < names.length, não <=. Usar <= avança um passo a mais e lança a exceção de fora do intervalo da seção anterior. Uma regra rápida: for-each quando você só lê valores, for indexado quando você precisa da posição ou quer escrever de volta no array.

Arrays multidimensionais

Um array 2D é, na verdade, um array de arrays - pense nele como uma grade de linhas e colunas. Você adiciona um segundo par de colchetes:

grid[linha][coluna] seleciona uma única célula. Como cada linha é seu próprio array, grid.length é o número de linhas e grid[0].length é o número de colunas da primeira linha. As linhas nem precisam ter o mesmo tamanho (isso se chama array irregular, ou jagged), embora a maioria das grades seja retangular.

A classe utilitária Arrays

Os arrays em si quase não têm métodos - você não consegue ordenar nem imprimir um diretamente de forma útil. Java fornece uma classe utilitária java.util.Arrays cheia de auxiliares estáticos exatamente para isso:

Algumas coisas em que se apoiar aqui. Arrays.toString(arr) é a forma certa de imprimir um array - imprimir um diretamente te dá uma string inútil como [I@1b6d3586. Arrays.sort ordena no lugar. Arrays.copyOf é como você "redimensiona": ele devolve um novo array com o tamanho que você pedir, preenchendo com valores padrão (as duas posições extras acima são 0). E Arrays.binarySearch só funciona corretamente em um array que já esteja ordenado.

Arrays vs ArrayList

Use um array simples quando o tamanho é conhecido de antemão e não vai mudar - um conjunto fixo de dias da semana, um tabuleiro de jogo, dados de pixels. Arrays são rápidos e leves, mas o tamanho fixo é uma limitação real: você não pode adicionar um sétimo elemento a um array de tamanho 6 sem construir um completamente novo.

No momento em que você precisa adicionar e remover itens livremente, um array fica desajeitado. É para isso que serve o ArrayList - uma lista redimensionável e expansível que cuida da cópia por você.

Próximo: ArrayList

Quando você não sabe quantos itens terá, ou esse número muda enquanto o programa executa, um array de tamanho fixo atrapalha. ArrayList é a resposta de Java: uma lista que cresce e encolhe sob demanda, com os métodos add e remove em vez de malabarismo com índices. É o que vem a seguir.

Perguntas frequentes

Como declarar e inicializar um array em Java?

Declare o tipo com colchetes e atribua um literal: int[] nums = {1, 2, 3};. Para criar um array vazio de tamanho fixo, use new: int[] nums = new int[5]; - isso te dá 5 posições, cada uma preenchida com o valor padrão (0 para int, null para objetos).

Como obtenho o tamanho de um array em Java?

Use o campo length (sem parênteses): nums.length. É um campo, não um método, então nums.length() é um erro de compilação. Note que String usa .length() com parênteses, mas arrays usam .length sem eles - uma confusão clássica.

Um array em Java pode mudar de tamanho depois de criado?

Não. Um array em Java tem um tamanho fixo definido na criação e você não pode aumentá-lo nem diminuí-lo. Se você precisa de uma lista que muda de tamanho, use um ArrayList. Para "redimensionar" um array, você criaria um novo, maior, e copiaria os elementos.

O que é ArrayIndexOutOfBoundsException em Java?

É o erro em tempo de execução que você recebe ao acessar um índice que não existe - menor que 0 ou >= array.length. Ao contrário de algumas linguagens, Java não devolve um valor padrão nem null para acessos fora do intervalo; ele lança uma exceção. Índices válidos sempre vão de 0 a length - 1.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR