Maison > Questions et réponses > le corps du texte
public static void swapEqual(int[] a,int[] b){
int[] temp=new int[b.length];
temp=b;
b=a;
a=temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] c={1,2};
int[] d={3,4};
swapEqual(c,d);
System.out.println(c[1]);
}
为什么打印出来的C[1]还是原来的2啊,为什么没有交换。数组的=不就是复制引用吗?通过函数可以把a,b的引用交换,这样不就是把内容交换了吗?
干嘛非要这样写?
public static void swap(int[] a,int[] b){
int[] temp=new int[b.length];
for(int i=0;i<b.length;i++){
temp[i]=b[i];
}
for(int i=0;i<b.length;i++){
b[i]=a[i];
}
for(int i=0;i<b.length;i++){
a[i]=temp[i];
}
}
这样子我试了一下,就可以达到交换的目的了
好困惑啊,求解!!
PHPz2017-04-18 10:49:30
swapEqual(int[] a,int[] b) :
Au début :
a --> {1,2} (adresse 1)
b --> ,4} (Adresse 2)
Après traitement par votre code (les adresses pointées par a et b sont échangées) :
b --> {1,2} (Adresse 1)
a - -> ; {3,4} (adresse 2)
mais cela n'affectera pas c, d. c, d sont toujours :
c --> d --> {3,4} (adresse 2)
swap(int[] a,int[] b) :
Au début :
a --> {1,2} (adresse 1)
b --> ,4} (Adresse 2)
est traité par votre code (les valeurs des adresses 1 et 2 sont échangées) :
a --> {3,4} (Adresse 1)
b -- > {1,2} (Adresse 2)
Bien que cela n'affecte pas les adresses pointées par c et d, la valeur sous l'adresse d'origine a changé :
c --> 4} (Adresse 1)
d ---> {1,2} (Adresse 2)
Ma compréhension est la suivante. Après l'avoir écrit, j'ai trouvé qu'il avait le même sens que l'expression de @lianera, donc je l'ai traité comme une explication supplémentaire.
//=========================================
Vous pouvez essayer d'utiliser return pour attribuer les valeurs de a et b échangées dans swapEqual(int[] a, int[] b) à c et d et voir le résultat.
PHP中文网2017-04-18 10:49:30
Dans la fonction swapEqual, seules les références des paramètres formels a et b sont modifiées, mais les références des paramètres réels c et d ne sont pas modifiées.
En swap, les valeurs des zones correspondant à c et d sont modifiées.
Pour ajouter, les tableaux en Java sont également des objets, donc a, b, c et d sont tous des références.
伊谢尔伦2017-04-18 10:49:30
Le concept de références en Java est un peu différent de celui en C++. Les références en Java sont équivalentes aux pointeurs en C++, vous ne pouvez donc pas modifier les paramètres réels en attribuant directement des valeurs aux paramètres formels.
阿神2017-04-18 10:49:30
Les références Java (y compris les types de base, les types de référence d'objet) généreront de nouvelles références lors des déclarations, des appels de méthode, etc., copiez la référence sur le côté droit du signe égal. Répartis selon les 3 situations suivantes :
La valeur représentée par le type de base est stockée dans la référence. Il y a une zone spéciale dans la référence pour stocker cette valeur, donc lors de la copie, la valeur est également copiée en même temps.
Cette zone de type référence stocke l'adresse mémoire de l'objet dans la mémoire tas Lorsque la référence est copiée, l'adresse mémoire pointée est la même, donc la copie de la valeur (c'est-à-dire. , l'objet) ne sera pas impliqué
Les tableaux contiennent des références stockées (y compris les types de base et les types de référence d'objet)
Informations de référence : en Java, les types de données de référence occupent-ils de la mémoire ?
Pour clarifier ce problème, vous devez d'abord comprendre qu'il existe quatre catégories et huit types de base en JAVA À l'exception des types de base, ce sont tous des types de référence. Par exemple, si vous écrivez int i = 1;
, alors son allocation en mémoire est la suivante : un espace est alloué dans la mémoire, le nom de cet espace est i, et le contenu à l'intérieur est 1.
Lorsque vous utilisez i, vous pouvez accéder au contenu de cet espace. Le type de référence est différent. Le type de référence occupe deux blocs de mémoire dans la mémoire. Par exemple : vous écrivez String s ; ou String s = null à ce moment-là, un morceau de mémoire est alloué dans la mémoire. Cette mémoire est chargée avec la valeur nulle, ce qui signifie que rien n'est chargé. Parce qu'il n'a pas encore été initialisé. Photo précédente :
Quant à l'attribution spécifique de ce s, elle dépend de la position où il est déclaré. Si s est déclaré comme variable locale, alors s se trouve dans l'espace de pile. Si ce n'est pas une variable locale, elle n'est pas allouée sur la pile. Mais lorsque vous utilisez s pour pointer vers un objet de type String, quelque chose change. Autrement dit, lorsque vous écrivez ensuite s = new String("zhihu");. Photo précédente :
Il y aura une valeur dans le s d'origine. Sur la base de cette valeur dans l'espace de s, vous pouvez trouver un autre morceau de mémoire sur le tas. Toutes les nouvelles choses sont dans la mémoire tas. Les attributs de chaîne sont alloués dans cette mémoire sur le tas. La mémoire tas est une mémoire allouée dynamiquement. Ainsi, comme il est alloué sur le tas, cela signifie en fait qu'il n'est pas certain de la quantité de mémoire occupée par le nouvel objet. Il ne peut être alloué que pendant l'exécution pour comprendre la taille de l'objet. Une autre raison pour laquelle la mémoire occupée ne peut pas être déterminée est que la méthode n'alloue de la mémoire que lors de son exécution. Si aucune méthode n’est appelée, la méthode n’est qu’un tas de code et n’occupe pas de mémoire.
伊谢尔伦2017-04-18 10:49:30
Merci à tous pour vos réponses, elles sont toutes très bonnes. Je comprends aussi