Este artigo descreve a função e o uso de replicação profunda Java. Compartilhe -o para sua referência, como segue:
Escrito antes:
O que é replicação profunda? Em Java, ao criar um objeto, geralmente temos uma referência apontando para o objeto. Quando alteramos o valor (propriedades) do objeto, referindo -se à variável, a referência permanece inalterada e altera a memória na memória, ou seja, o objeto apontado. De um modo geral, quando atribuímos essa referência a outra variável de referência ou a passamos como um parâmetro, apenas passamos, ou seja, apontamos a referência para "copiar" uma cópia para outra variável de referência e, em seguida, a variável de referência também aponta para o mesmo objeto e nenhum novo objeto é criado na memória. Em alguns casos, precisamos "realmente copiar" o objeto, criar uma cópia do objeto conhecido, não apenas "copiar" a referência, seja um backup ou outras operações.
Então, como alcançá -lo?
Vamos falar sobre a idéia primeiro: primeiro serialize o objeto no fluxo, depois a desestimize e leia -o do fluxo.
O seguinte código:
pacote com.yo.java; importar java.io.byteArrayInputStream; importar java.io.bytearrayoutputStream; importar java.io.ioException; importar java.io.objectinputStream; import java.io.objectream; importa.IlAltStream; importanizlable; importAmilable; java.util.list;/** * java implementa cópias profundas * @author yo * */public classe DeepCopy implementa serializável {int i; / ** * @param args * @throws ioexception * @throws ClassNotFoundException */ public static void main (string [] args) lança classNotFoundException, ioException {Demo1 (); Demo2 (); }/** * cópia profunda, a classe de parâmetro real deve implementar a interface serializável * @param o * @return * @throws ioexception * @throws ClassNotFoundException */Public Static Object DeepCopy (objeto o) lança IOException, classNOTFoundException {/// Serialize First e Writray para a streamrayearTearEarEarearearearearyeout; ObjectOutputStream oo = new ObjectOutputStream (BO); oo.WriteObject (O); // em seguida, desaperializando e leia do fluxo, isto é, copiando bytearrayInputStream bi = novo byteArrayInputStream (bo.tobytearray ()); ObjectInputStream oi = new ObjectInputStream (BI); retornar oi.readObject (); } / ** * Passagem de referência e cópia profunda * @throws ClassNotFoundException * @THOWSOWSCECCECTION * / public static void Demo1 () lança ClassNotFoundException, IoException { System.out.println("========================================================================================== ============================================================================================================== ============================================================================================================== =============================================================================================================== 1; // inicialize o valor de I em DC1 Deepcopy DC2 = DC1; System.out.println("===================================================================================== ========================================================================================================== ========================================================================================================= ========================================================================================================== (Deepcopy) Deepcopy (DC3); void Demo2 () lança ClassNotFoundException, IoException {System.out.println ("===============================================. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. Out of System. System. System. System. System. Out of System. System. System. System. System. System. Out of System. System. System. System. System. System. Out of System. System. System. System. System. System. System. System. Out of System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System. System src) The result is the same //Change the value of the element in list1 for(DeepCopy d1 : list1) { //Change the value of i in dc1 d1.i = 2; } // Lista de transipos para (Deepcopy D1: List1) {System.out.println ("List1:" + D1.i); System.out.println ("=========================================================================== ============================================================================================================================== ============================================================================================================================== ============================================================================================================================== Novo, inicialize o valor de I em DC3 List <efterCopy> List3 = novo Arraylist <EardCopy> (LIST.AdCopy) D3: List3) {System.out.println ("List3:" + d3.i);Os resultados da operação acima são os seguintes (realmente medidos):
================================================================================================================== ================================================================================================================== ================================================================================================================== =================================================================================================================== : 2List4 (cópia profunda): 1
Pode -se observar que, ao apenas se referir a passar ou criar um novo valor com base no valor do objeto, ele só pode ser chamado de "cópia rasa". Quando as propriedades do objeto original mudam, as propriedades do novo objeto criadas de acordo com o método acima também mudarão de acordo; E se a cópia profunda for usada, é verdade que um novo objeto é copiado. O novo objeto não tem relação com o objeto original. A mudança das propriedades do objeto original não afetará o novo objeto, assim como o significado da cópia.
Como mencionado acima, se houver alguma inadequação, se você puder apontar, muito obrigado
Para mais conteúdo relacionado ao Java, os leitores interessados neste site podem visualizar os tópicos: "Estrutura de dados Java e tutorial de algoritmo", "Resumo da operação Java Dom Node Tips", "Resumo de Dicas de Operação de Arquivos e Diretórios de Java" e "Resumo das dicas de operação do Java Cache"
Espero que este artigo seja útil para a programação Java de todos.