Array semble être passé par référence en Java, comment est-ce possible?
Je peux poster plus de code si j'en ai besoin, mais avant cela, je voudrais juste poser une question générale sur la méthode suivante dans laquelle un tableau est passé, et qu'un autre tableau, mais pour une raison quelconque, le tableau d'origine, celui-ci étant passé de, est également changé, comment ce possible/que dois-je faire?
Grâce
tempBoard est un tableau de même taille que currentState, et temp[k] contient les modifications qui sont apportées dans movePiece, l'état actuel est déclaré dans la méthode et n'est pas une variable globale
private int[][] MiniMaxBaseCase(int[][] currentState, int currentColor)
{
tempBoard = movePiece(currentState,temp[k]);
}
private int[][] movePiece(int[][] currentState, int[] move)
{
if(move[0] == -1)
return currentState;
//if the piece is just moving
if(move[4] == -1)
{
currentState[move[2]][move[3]] = currentState[move[0]][move[1]];
currentState[move[0]][move[1]] = 0;
return currentState;
}
//if the piece is jumping another
if(move[4] != -1)
{
currentState[move[4]][move[5]] = currentState[move[0]][move[1]];
currentState[move[2]][move[3]] = 0;
currentState[move[0]][move[1]] = 0;
return currentState;
}
return currentState;
}
source d'informationauteur jbernie2 | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
En Java:
L'effet net d'une variable de référence être passé par valeur, est que le objet ou un tableau pointé par la variable de référence est passé par référence.
Votre tableau a été effectivement passé par référence - son le même tableau.
Plus précisément,
currentState
dansMiniMaxBaseCase
est une référence à un tableau - la valeur de c'est l'emplacement de la mémoire de la matrice.currentState
dansMiniMaxBaseCase
est passé par valeur àmovePiece
de sorte que la valeur decurrentState
dansMiniMaxBaseCase
(un emplacement de mémoire) si elle est copiée dans le paramètrecurrentState
dansmovePiece
- la référence a été transmis par valeur. Mais maintenantcurrentState
dansmovePiece
pointe vers le même emplacement mémoire quecurrentState
dansMiniMaxBaseCase
. Alors maintenant, les deux variables pointent vers le même tableau, c'est à dire l'effet net est que le tableau a été effectivement passé par référence.Edit: Copie multi-dimensions des tableaux
Certaines personnes ont suggéré d'utiliser
System.arraycopy()
ouArray.copyOf()
directement, sans traversant dans la première dimension/index. Cela ne fonctionnera pas.Utiliser ce lieu:
La raison pour laquelle une copie directe ne fonctionne pas c'est parce qu'en Java, un tableau en 2 dimensions est vraiment un tableau de pointeurs/références à une collection de (dispersés) 1-dimensions des tableaux, c'est à dire,
int[][]
est un tableau de pointeurs vers un tas de (dispersés)int[]
. Simplement faireSystem.arraycopy()
ouArrays.copyOf()
sur un tableau 2d sera tout simplement copier les pointeurs vers les dispersésint[]
tableauxc'est à dire cette copie se termine le partage de l'ensemble sous-jacent de tableaux. Vous devez faire une copie en profondeur, comme indiqué dans le code ci-dessus.Quelques références:
Comment dois-je faire une copie d'un tableau 2d en Java?
http://www.cs.dartmouth.edu/~spl/Academic/Java/JFAQs.html
Comment puis-je copier des multi-dimensions des tableaux?
En Java il n'y a PAS une TELLE CHOSE que le passage par référence. Vous semblez connaître et se demander pourquoi il se sent toujours comme ça c'est ce qui se passe ici...
Bien le Problème, c'est que les tableaux sont des Objets. Et les Objets sont en fait des Pointeurs. Ainsi, vous obtenez une COPIE du pointeur vers le tableau, mais c'est encore le tableau il pointe.
Utilisation Du Système.arraycopy() si vous souhaitez créer une copie du tableau avant de faire des changements..
Prendre un certain temps pour avoir une bonne lecture de ce.
http://www.cs.toronto.edu/~dianeh/tutoriels/params/
Passer à "Passage de Tableaux"
C'est à partir d'un cours "148: Introduction à la Science Informatique", qui doit s'adapter autour de la première 2 cours sur le langage Java.
De transmettre une copie d'un tableau à une fonction, dans la version 1.6 de Java, vous pouvez utiliser le Tableau.copyOf, e.g
Remarque:
Array.copyOf
est bon seulement pour une seule dimension du tableau des primitives. Utilisé sur n'importe quoi d'autre, il vous donne un tableau indépendant, avec tous les éléments IDENTIQUES et pointant vers le tableau d'origine, que ce soit des Objets ou des tableaux imbriqués.