2012-11-05 3 views
0

Pour rendre ma question compréhensible, j'utilise l'exemple de code suivant. La sortie de ce code est 5, alors que je voulais qu'il soit 3. Je devine que B fonctionne comme un pointeur pour A, mais je veux que A soit copié dans B initialement, et les changements ultérieurs dans A ne devraient pas affecter B .Comment se débarrasser des pointeurs?

import java.io.*; 
public class fg 

{ 

public static void main(String args[]) throws Exception 
{ 

    int[] A = new int[3]; 
      A[0]=1; 
      A[1]=3; 
      A[3]=7; 

    check(A); 


} 

public static void check(int[] A) 
{    
    int[] B = A; 

    A[1] = 5; 

    System.out.println(B[1]); 
} 

}

+0

Vous cherchez quelque chose comme 'int [] b = new int [] (A);'? –

+0

'int [] [] A = new int [3];' ne compilera pas! changez-le en 'int [] A = new int [3];' – jlordo

+0

@jlordo: Merci, corrigé. C'était juste une faute de frappe. – iamlegend

Répondre

5

Vous devez créer explicitement une copie,

int[] B = Arrays.copyOf(A, A.length); 

depuis int[] est un type de référence, donc une mission que des copies de la référence (essentiellement, pointeur).

Si les éléments eux-mêmes ne sont pas des types primitifs de tableau, vous aurez probablement besoin d'une copie en profondeur, afin

type B[] = new type[A.length]; 
for(int i = 0; i < A.length; ++i) { 
    B[i] = makeCopyOf(A[i]); 
} 

makeCopyOf() devrait créer une copie raisonnable d'une instance type. Si vous ne trouvez rien de mieux, type makeCopyOf(type orig) { return orig.clone(); } pourrait servir de solution de repli.

+1

Je voudrais remettre en question l'utilisation de clone() - voir http://www.artima.com/intv/bloch13.html –

+0

Merci, @Brian, très instructif. –

2

B est une référence , et en tant que telle est analogue à un pointeur (avec diverses différences - vous ne pouvez pas faire de l'arithmétique et ce n'est pas un pointeur direct à la mémoire).

En tant que tel, vous devrez créer un copy of the structure (the array) auquel vous faites référence. Notez que si vous copiez des objets, vous aurez peut-être besoin d'une copie en profondeur . Vous devrez probablement faire cela dans un constructeur de copie (voir cet article pour why clone() is considered broken)

Questions connexes