Eu tenho uma matriz a
que está sendo constantemente atualizada. Vamos dizer a = [1,2,3,4,5]
. Preciso fazer uma cópia exata exata a
e chamá-lo b
. Se a
fosse mudar para [6,7,8,9,10]
, b
ainda deveria ser [1,2,3,4,5]
. Qual é a melhor maneira de fazer isso? Eu tentei um for
loop como:
for(int i=0; i<5; i++) {
b[i]=a[i]
}
mas isso não parece funcionar corretamente. Por favor, não use termos avançados como cópia em profundidade, etc., porque não sei o que isso significa.
System.arraycopy
, verá que o método precisa verificar várias coisas antes de iniciar. Algumas dessas verificações são desnecessárias com um loop de cópia, dependendo dos tipos de matriz estática.clone()
acaba sendo o mais rápido para 250.000 elementos.src.clone()
é mais legível e tem muito menos oportunidade de erro do que alocar uma nova matriz e executararraycopy
. (E também é rápido).você pode usar
também.
fonte
Se você deseja fazer uma cópia de:
Este é o caminho a seguir:
Arrays.copyOf
pode ser mais rápido do quea.clone()
em pequenas matrizes. Ambos os elementos de cópia são igualmente rápidos, mas clone () retornaObject
para que o compilador precise inserir uma conversão implícita emint[]
. Você pode vê-lo no bytecode, algo como isto:fonte
Boa explicação de http://www.journaldev.com/753/how-to-copy-arrays-in-java
Métodos de cópia de matriz Java
fonte
Sinto que todas essas "melhores maneiras de copiar uma matriz" não vão realmente resolver o seu problema.
Você diz
Olhando para esse loop, não há razão óbvia para que ele não funcione ... a menos que:
a
eb
bagunçadas (por exemplo,a
e seb
refere à mesma matriz) oua
matriz simultaneamente.Em ambos os casos, maneiras alternativas de fazer a cópia não resolverão o problema subjacente.
A correção para o primeiro cenário é óbvia. Para o segundo cenário, você precisará descobrir uma maneira de sincronizar os threads. As classes de matriz atômica não ajudam porque não possuem construtores de cópia atômica ou métodos de clone, mas a sincronização usando um mutex primitivo fará o truque.
(Há dicas na sua pergunta que me levam a pensar que isso está realmente relacionado ao segmento; por exemplo, sua declaração que
a
está constantemente mudando.)fonte
Você pode tentar usar Arrays.copyOf () em Java
fonte
Toda solução que chama comprimento da matriz, adicione seu código redundante nulo checkersconsider exemplo:
Eu recomendo que você não invente a roda e use a classe de utilidade onde todas as verificações necessárias já foram realizadas. Considere ArrayUtils do apache commons. Seu código se torna mais curto:
Apache commons você pode encontrar lá
fonte
Você também pode usar
Arrays.copyOfRange
.Exemplo :
Este método é semelhante
Arrays.copyOf
, mas é mais flexível. Ambos usamSystem.arraycopy
sob o capô.Veja :
fonte
Para uma cópia nula segura de uma matriz, você também pode usar um opcional com o
Object.clone()
método fornecido nesta resposta .fonte
Optional
objeto é apenas um objeto vazio com uma referência à matriz existente. Sobre o impacto no desempenho, eu diria que é prematuro dizer que é realmente um impacto, já que esse tipo de construção é um bom candidato para incluir na JVM e, em seguida, não tem mais impacto que outros métodos. É uma questão de estilo (programação funcional versus programação processual, mas não apenas) considerá-la mais complicada ou não.Se você precisa trabalhar com matrizes de matérias e não
ArrayList
em seguida,Arrays
tem o que você precisa. Se você olhar para o código-fonte, essas são as melhores maneiras de obter uma cópia de uma matriz. Eles têm uma boa parte de programação defensiva porque oSystem.arraycopy()
método lança muitas exceções não verificadas se você alimentar parâmetros ilógicos.Você pode usar o
Arrays.copyOf()
que copiará do primeiro para oNth
elemento para a nova matriz mais curta.ou
Arrays.copyOfRange()
também fará o truque:Como você pode ver, ambas são apenas funções de invólucro
System.arraycopy
com lógica defensiva de que o que você está tentando fazer é válido.System.arraycopy
é a maneira mais rápida de copiar matrizes.fonte
Eu tive um problema semelhante com matrizes 2D e terminei aqui. Eu estava copiando a matriz principal e alterando os valores das matrizes internas e fiquei surpreso quando os valores mudaram nas duas cópias. Basicamente, ambas as cópias eram independentes, mas continham referências às mesmas matrizes internas e eu tive que fazer uma série de cópias das matrizes internas para conseguir o que queria.
Provavelmente não é problema do OP, mas espero que ainda possa ser útil.
fonte