Estendendo o comprimento de uma matriz
1. Visão geral
Neste tutorial, vamos dar uma olhada nas diferentes maneiras em que podemos estender um Javaarray.
Uma vez que as matrizes são um bloco contíguo de memória, a resposta pode não ser imediatamente aparente, mas vamos desempacotar isso agora.
2. UsandoArrays.copyOf
Primeiro, vamos dar uma olhada emArrays.copyOf. Vamos copiar a matriz e adicionar um novo elemento à cópia:
public Integer[] addElementUsingArraysCopyOf(Integer[] srcArray, int elementToAdd) {
Integer[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);
destArray[destArray.length - 1] = elementToAdd;
return destArray;
}
A maneira comoArrays.copyOf funciona é que ele pegasrcArrayecopies the number of elements specified in the length argument to a new array que cria internamente. O tamanho da nova matriz é o argumento que fornecemos.
Uma coisa a notar é que quando o argumento de comprimento é maior que o tamanho do array de origem,Arrays.copyOf preencherá os elementos extras no array de destino comnull.
Depending on the datatype, the behavior of the filling will be different. Por exemplo, se usarmos tipos de dados primitivos no lugar deInteger, os elementos extras serão preenchidos com zeros. No caso dechar,Arrays.copyOf preencherá os elementos extras comnulle no caso deboolean, comfalse.
3. UsandoArrayList
A próxima maneira que veremos é usandoArrayList.
Vamos primeiroconvert the array to anArrayListe, em seguida, adicionar o elemento. Então vamosconvert the ArrayList back to an array:
public Integer[] addElementUsingArrayList(Integer[] srcArray, int elementToAdd) {
Integer[] destArray = new Integer[srcArray.length + 1];
ArrayList arrayList = new ArrayList<>(Arrays.asList(srcArray));
arrayList.add(elementToAdd);
return arrayList.toArray(destArray);
}
Observe que passamos osrcArray ao convertê-lo emCollection. OsrcArray serápopulate the underlying array in the*ArrayList*.
Além disso, outra coisa a notar é que passamos a matriz de destino como um argumento paratoArray. Este método serácopy the underlying array to the destArray.
4. UsandoSystem.arraycopy
Finalmente, daremos uma olhada emSystem.arraycopy, que é bastante semelhante aArrays.copyOf:
public Integer[] addElementUsingSystemArrayCopy(Integer[] srcArray, int elementToAdd) {
Integer[] destArray = new Integer[srcArray.length + 1];
System.arraycopy(srcArray, 0, destArray, 0, srcArray.length);
destArray[destArray.length - 1] = elementToAdd;
return destArray;
}
Um fato interessante é queArrays.copyOf internally uses this method.
Aqui podemos notar que nóscopy the elements from the srcArray to destArraye entãoadd the new element para odestArray.
5. atuação
Uma coisa comum em todas as soluções é que precisamos criar uma nova matriz de uma maneira ou de outra. A razão disso reside em como as matrizes são alocadas na memória. Um array contém umcontiguous block of memory para pesquisa super-rápida, e é por isso que não podemos simplesmente redimensioná-lo.
Obviamente, isso tem um impacto no desempenho, especialmente para matrizes grandes. É por isso queArrayList superaloca, reduzindo efetivamente o número de vezes que a JVM precisa realocar a memória.
Mas, se estivermos fazendo muitas inserções, um array pode não ser a estrutura de dados certa e devemos considerar umLinkedList.
6. Conclusão
Neste artigo, exploramos as diferentes maneiras de adicionar elementos ao final de uma matriz.
E, como sempre, todo o código está disponívelover on GitHub.