Modifier un tableau passé en tant que méthode de paramètre
Supposons que j'ai un int-tableau et je souhaite le modifier. Je sais que je ne peux pas attribuer un nouveau tableau à tableau passé en paramètre:
public static void main(String[] args)
{
int[] temp_array = {1};
method(temp_array);
System.out.println(temp_array[0]); //prints 1
}
public static void method(int[] n)
{
n = new int[]{2};
}
alors que je peux le modifier:
public static void main(String[] args)
{
int[] temp_array = {1};
method(temp_array);
System.out.println(temp_array[0]); //prints 2
}
public static void method(int[] n)
{
n[0] = 2;
}
Ensuite, j'ai essayé d'attribuer l'arbitraire d'un tableau pour le tableau passé en paramètre à l'aide de clone()
:
public static void main(String[] args)
{
int[] temp_array = {1};
method(temp_array);
System.out.println(temp_array[0]); //prints 1 ?!
}
public static void method(int[] n)
{
int[] temp = new int[]{2};
n = temp.clone();
}
Maintenant, je me demande pourquoi il imprime à 1 dans le dernier exemple, alors que je suis juste de copier le tableau avec clone()
qui c'est juste de la copie de la valeur de référence. Pourriez-vous expliquer que pour moi?
EDIT: Est-il un moyen de copier un tableau d'objet sans modifier la référence? Je veux faire le dernier exemple de l'impression 2
.
OriginalL'auteur Eng.Fouad | 2011-08-20
Vous devez vous connecter pour publier un commentaire.
Vos exemples 1 et 3 sont pratiquement les mêmes dans le contexte de la question - que vous essayez d'assigner une nouvelle valeur à
n
(qui est une référence à un tableau passé par valeur).Le fait que vous cloné
temp
tableau n'a pas d'importance - tout cela n'était de créer une copie detemp
et à l'attribuer àn
.Afin de copier les valeurs dans le tableau passé en votre
method
méthode, vous voudrez peut-être consulter:Système.arraycopyTout cela, bien sûr, dépend de la taille de vos
n
tableau et celui que vous créez à l'intérieur demethod
méthode.En supposant que les deux ont la même longueur, par exemple, vous pouvez le faire comme ça:
OriginalL'auteur ZenMaster
Dans votre méthode
n
est un autre nom pour le tableau de cette façon. Il pointe à la même place en mémoire que l'original, qui est un tableau d'entiers. Si vous modifiez l'une des valeurs stockées dans le tableau, tous les noms qui pointent vers lui permet de voir le changement.Cependant, dans la méthode
Vous êtes en train de créer un nouveau tableau et ensuite en disant: "le nom de 'n' maintenant les points à cela, d'autres de tableau, pas celui qui a été adopté dans le". En effet, le nom " n " est plus un nom pour le tableau qui a été passé.
OriginalL'auteur RHSeeger
Comme vous l'avez remarque, vous ne devez pas céder à la référence de tableau passé en paramètre. (Ou, plus précisément, la cession n'aura aucun effet en l'appelant.)
C'est sur le meilleur que vous pouvez faire:
Bien sûr, cela ne fonctionne correctement que si la taille du tableau d'entrée est la même que la taille de la pile de la copie. (Comment vous devez traiter ce sera d'application spécifiques ...)
Pour l'enregistrement Java passe le tableau de référence par la valeur. Il ne passe pas le contenu du tableau par valeur. Et clone ne va pas aider à résoudre ce problème. (Au moins, pas avec la signature de la méthode déclarée.)
clone()
faire exactement?Il crée une copie de l'objet. Mais le point est que vous n'avez pas besoin de créer une copie du tableau. Plutôt que vous devez copier son contenu.
OriginalL'auteur Stephen C
Dans votre
method
méthode, rien que de vous affecter àn
de changer la valeur de l'objet passé en et affecté àn
. Au début demethod
,n
points à un tableau. Lorsque vous affectezn
sur un autre tableau, vous avez tout simplement re-pointé pile den
points, et n'ai rien changé surtemp_array
de lamain
méthode.OriginalL'auteur Sean Adkinson