// array de inteiros com 5 posições.
int[] inteiros = new int[5];
// array de String com 8 posições.
String[] strings = new int[8];
// array de Produto com 20 posições.
Produto[] produtos = new Produto[8];
A palavra array significa "conjunto de coisas posicionadas em linha". A palavra mais próxima em português seria arranjo que não transmite a relação de ordem entre os elementos.É comum vermos palavras como sequencia, vector, matriz ou fila como traduções de array, mas nenhuma delas expressa o real significado de "arranjo" porque a semântica é mais rica. Por exemplo, "sequencia" implica na existência de ordem, "vector" implica uma referencia geométrica e matemática que não é verdadeira. "matriz" implica no conceito de múltiplas dimensões e "fila" implica no conceito não apenas de ordem, mas também na noção de ordem de entrada/ordem de saída (como, por exemplo, FIFO: First In, First Out). Manteremos portanto o termo array sem tentar traduzi-lo.
Um array, é um objeto primitivo, ou seja, é um objeto definido pela linguagem e plataforma que já vem pronto para usarmos. Este objeto é especial em relação aos outros objetos já que agrega outros objetos que compartilham um supertipo comum e aos quais nos podemos referir por um índice (um numero inteiro). Arrays podem ser de tamanho fixo ou variável. Em java, por exemplo, são de tamanho fixo. Isto significa que não ha forma de modificar o tamanho do array para comportar mais ou menos elementos. Se o tamanho do array em uso não for suficiente teremos que criar um outro array e fazer uma cópia, elemento a elemento do antigo para o novo.
O uso de um array em java é composto de duas fases: a declaração e a inicialização. Na declaração dizemos de que tipo o array será e qual é o seu tamanho. O tamanho do array tem que ser explicitamente informado já que este tamanho nunca será alterado.
Eis alguns exemplos:
// array de inteiros com 5 posições.
int[] inteiros = new int[5];
// array de String com 8 posições.
String[] strings = new int[8];
// array de Produto com 20 posições.
Produto[] produtos = new Produto[8];
Array podem ser criados de tipos primitivos ou de objetos. A forma de declaração é semelhante. A sintaxe do java aceita que o simbolo de array "[]" possa ser colocado no nome da variável:
// array de inteiros com 5 posições.
int[] inteiros = new int[5];
// pode ser declarado também como
int inteiros[] = new int[5];
Esta segunda forma é tradicional em outras linguagens, e embora possivel em java, não é a forma sugerida. Isto porque, em java, um qualquer tipo
X
representa um objeto e um tipo X[]
representa um array de objetos X. Desta forma é sugerida e comum o uso da primeira forma de declaração em vez da segunda.
O próximo passo é atribuir valores a cada uma das posições do array. Podemos fazer isso explicitamente ou usado instruções for
ou while
.
// array de inteiros com 5 posições.
int[] numeroPares = new int[5];
// inicializado manualmente
numeroPares[0] = 0;
numeroPares[1] = 2;
numeroPares[2] = 4;
numeroPares[3] = 6;
numeroPares[4] = 8;
// inicializando num ciclo.
for (int i = 0; i < numeroPares.length ; i++ ){
numeroPares[i] = i*2;
}
Repare que para conseguir utilizar a inicialização com for
usamos a propriedade length
do array. Esta propriedade contém o numero de posições do array ( no caso do exemplo, 5). Repare também que usamos uma variável para acessar a posição do array. Esta é a utilização mais direta e útil do array já que uma qualquer posição pode ser referida por uma variável. Contudo, esta variável só pode ser do tipo int
.
A forma manual de inicilização pode ser bastante extensa e pesada de escrever, mas existe uma outra forma, mais sucinta, de inicializar um array:
int[] numeroPares = new int[]{0,2,4,6,8};
Usando chaves podemos escrever os valores para as posições do array. Repare que neste caso não declaramos o tamanho do array, que obrigatoriamente será igual ao numero de elementos escritos entre chaves.
O tamanho de um array, em java, é fixo. Se precisarmos de mais posições no array além daquela que explicitamos durante a construção não temos como alterar o array. Sendo assim, a única opção que nos resta é criar outro array maior, e copiar os elementos que já temos para esse array. Para fazermos isto utilizamos o método System.arrayCopy
.
Imaginemos que queremos extender o nosso array de numeros pares para mais 10 posições, eis o que fariamos:
int[] numeroPares = new int[]{0,2,4,6,8};
int[] numeroParesMaior = new int[15]; // 5 + 10
System.arrayCopy(numeroPares, 0, numeroParesMaior, numeroPares.length);
Primeiro criamos o array com mais posições. É um outro objeto que declaramos com um tamanho maior. Depois , em vez de inicializarmos manualmente ou com uma instrução de ciclo, utilizamos os método `arraycopy`. Este método é mais eficiente que qualquer outra opção que a linguagem java tem a oferecer. Portanto, realizar um laço para copiar arrays é uma péssima prática em java. O método `System.arrayCopy` está na classe `System` exatamente para deixar claro que o java irá (onde possível) usar recursos nativos do sistema para fazer a cópia. Após a invocação deste método, o array `numeroParesMaior` terá os mesmos valores que o array anterior tinha, nas mesmas posições.
É muito importante entender que a falha em dimensionar corretamente o array irá causar danos na performance do sistema já que este será obrigado a fazer copias entre arrays cada vez maiores. Isto é especialmente importante para entender o uso correto da classe ArrayList
que é baseada em um array.
Arrays podem ter mais do que uma dimensão. Esta capacidade é normalmente utilizada para implementar matrizes.
Aumentar o numero de dimensões torna a declaração e a inicialização um pouco mais complicadas. Imaginemos que queremos criar uma matriz 3x3 de inteiros. Ficaria assim:
int[][] matrix = new int[3][3];
for (int i = 0; i < matrix.length ; i++ ){
matrix[i] = new int[3];
for (int j = 0 ; j < matrix[i].length; j++){
matrix[i][j] = i+j;
}
}
Começamos por declarar a matriz como sendo de duas dimensões de tamanho 3. Em java, array multidimensionais não precisam ter o mesmo tamanho em cada dimensão. É mais simples entender o processo se imaginarmos um array normal de uma dimensão que em cada posição contém um outro array normal de uma dimensão.
É por isso que antes de colocarmos o valor na posição (i,j) temos que inicializar um array de tamanho 4 na posição i.
Se estivermos interessados em carregar o array diretamente podemos optar por escrever assim:
int[][] matrix = {
{0,1,2},
{1,2,3},
{2,3,4}
};
Esta forma é mais compacta é fica evidente que se trata de um array de arrays e não de uma matriz, propriamente dita.
Embora tudo isto sendo possível não é, na prática, muito útil. Em uma linguagem orientada a objetos como java existem algoritmos que podem simular matrizes usando arrays unidimensionais e até não usando arrays. Várias bibliotecas implementam objetos relacionados a álgebra como uma semantiva muito mais rica que os arrays.
Devido a que o tamanho do array é fixo, arrays não são tão uteis em java como em outras linguagens, onde são usados como substituídos de objetos de coleção. Em java esse papel cabe aos objetos definidos pelo Java Collections Framework[[1]]. Contudo, é muitas vezes necessário converter coleções em arrays e vice-versa. Para converter um array em uma coleção basta usa o método Arrays.asList
. Este método recebe uma array e devolve um objeto do tipo List
. Este método é eficiente porque realmente não faz uma cópia do array para uma lista, apenas encapsula o array na interface List
. Por causa disto, esta lista não pode ser modificada e a tentativa de incluir ou remover elementos da lista causará exceções.
Todos os objetos de coleção têm o método toArray
com duas sobrecargas. Uma sem argumentos e uma com um array como parâmetro. O método toArray
sem argumentos cria um array de Object
e carrega nas posições os elementos da coleção. A ordem que a carga é feita depende da implementa da coleção e o respetivo javadoc deve ser consultado. O método toArray
que recebe um array como paramento simplesmente copia os elementos da coleção para esse array começando na primeira posição, devolvendo esse mesmo array. Este método é preferivel porque dá ao programador, não apenas o controle sobre o tamanho do array, mas também o seu tipo.
Arrays são peças básicas em qualquer linguagem de programação. Em java, arrays são objetos de tamanho fixo. Isto pode impactar certos algoritmos e usos gerais de arrays. Em particular o uso de arrays como coleções, o que não é recomendado e sugere-se o uso do Java Collections Framework.
Contudo o uso de arrays é comum e necessário em muitos casos simples e como ferramenta para criar objetos mais complexos.
[1] The Collections Framework, Sun Microsystems, Inc. (http://java.sun.com/javase/6/docs/technotes/guides/collections/index.html)