Adicionando um elemento a uma matriz Java versus um ArrayList
1. Visão geral
Neste tutorial, veremos brevemente as semelhanças e diferenças na alocação de memória entre matrizes Java eArrayList. Além disso, veremos como anexar e inserir elementos em uma matriz eArrayList.
2. Matrizes Java e ArrayList
AJava array é uma estrutura de dados básica fornecida pela linguagem. Em contraste,ArrayList é uma implementação da interfaceList apoiada por uma matriz e é fornecida no Java Collections Framework.
2.1. Acessando e modificando elementos
Podemos acessar e modificar elementos de matriz usando a notação de colchetes:
System.out.println(anArray[1]);
anArray[1] = 4;
Por outro lado,ArrayList possui um conjunto de métodos para acessar e modificar elementos:
int n = anArrayList.get(1);
anArrayList.set(1, 4);
2.2. Tamanho fixo versus dinâmico
Uma matriz eArrayList alocam memória heap de maneira semelhante, mas a diferença é quean array is fixed-sized, while the size of an ArrayList increases dynamically.
Como uma matriz Java é de tamanho fixo, precisamos fornecer o tamanho enquanto a instanciamos. Não é possível aumentar o tamanho da matriz depois de instanciada. Em vez disso, precisamos criar uma nova matriz com o tamanho ajustado e copiar todos os elementos da matriz anterior.
ArrayList é uma implementação de array redimensionável da interfaceList - ou seja,ArrayList cresce dinamicamente conforme elementos são adicionados a ele. Quando o número de elementos atuais (incluindo o novo elemento a ser adicionado aArrayList) é maior que o tamanho máximo de sua matriz subjacente, entãoArrayList aumenta o tamanho da matriz subjacente.
A estratégia de crescimento do array subjacente depende da implementação deArrayList. No entanto, como o tamanho da matriz subjacente não pode ser aumentado dinamicamente, uma nova matriz é criada e os elementos antigos da matriz são copiados para a nova matriz.
A operação de adição possui um custo de tempo amortizado constante. In other words, adding n elements to an ArrayList requires O(n) tempo.
2.3. Tipos de elemento
Uma matriz pode conter tipos de dados primitivos e não primitivos, dependendo da definição da matriz. No entanto,an ArrayList can only contain non-primitive data types.
Quando inserimos elementos com tipos de dados primitivos em umArrayList, o compilador Java converte automaticamente o tipo de dados primitivos em sua classe wrapper de objeto correspondente.
Vejamos agora como acrescentar e inserir elementos em matrizes Java eArrayList.
3. Anexando um elemento
Como já vimos,arrays are of fixed size.
Portanto, para acrescentar um elemento, primeiro, precisamos declarar uma nova matriz que seja maior que a matriz antiga e copiar os elementos da matriz antiga para a matriz recém-criada. Depois disso, podemos acrescentar o novo elemento a essa matriz recém-criada.
Vejamos sua implementação em Java sem usar nenhuma classe de utilitário:
public Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) {
Integer[] destArray = new Integer[srcArray.length+1];
for(int i = 0; i < srcArray.length; i++) {
destArray[i] = srcArray[i];
}
destArray[destArray.length - 1] = elementToAdd;
return destArray;
}
Como alternativa, a classeArrays fornece um método utilitáriocopyOf(), que auxilia na criação de uma nova matriz de tamanho maior e na cópia de todos os elementos da matriz antiga:
int[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);
Depois de criar uma nova matriz, podemos anexar facilmente o novo elemento à matriz:
destArray[destArray.length - 1] = elementToAdd;
Por outro lado,appending an element in ArrayList is quite easy:
anArrayList.add(newElement);
4. Inserindo um elemento no índice
Inserir um elemento em um determinado índice sem perder os elementos adicionados anteriormente não é uma tarefa simples em matrizes.
Primeiro, se a matriz já contém o número de elementos igual ao seu tamanho, primeiro precisamos criar uma nova matriz com um tamanho maior e copiar os elementos para a nova matriz.
Além disso, precisamos mudar todos os elementos que vêm após o índice especificado em uma posição para a direita:
public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) {
int[] destArray = new int[srcArray.length+1];
int j = 0;
for(int i = 0; i < destArray.length-1; i++) {
if(i == index) {
destArray[i] = newElement;
} else {
destArray[i] = srcArray[j];
j++;
}
}
return destArray;
}
No entanto, oArrayUtils class gives us a simpler solution to insert items into an array:
int[] destArray = ArrayUtils.insert(2, srcArray, 77);
Temos que especificar o índice no qual queremos inserir o valor, a matriz de origem e o valor a inserir.
O métodoinsert() retorna uma nova matriz contendo um número maior de elementos, com o novo elemento no índice especificado e todos os elementos restantes deslocados uma posição para a direita.
Observe que o último argumento do métodoinsert() é um argumento variável, portanto, podemos inserir qualquer número de itens em um array.
Vamos usá-lo para inserir três elementos emsrcArray começando no índice dois:
int[] destArray = ArrayUtils.insert(2, srcArray, 77, 88, 99);
E os elementos restantes serão deslocados três lugares para a direita.
Além disso, isso pode ser alcançado trivialmente paraArrayList:
anArrayList.add(index, newElement);
ArrayList desloca os elementos e insere o elemento no local necessário.
5. Conclusão
Neste artigo, vimos o array Java eArrayList. Além disso, analisamos as semelhanças e diferenças entre os dois. Finalmente, vimos como anexar e inserir elementos em um array eArrayList.
Como sempre, o código-fonte completo dos exemplos de trabalho está disponívelover on GitHub.