Java: Pourquoi cette méthode d’échange ne fonctionne-t-elle pas?

J’ai le code suivant:

public class Main { static void swap (Integer x, Integer y) { Integer t = x; x = y; y = t; } public static void main(Ssortingng[] args) { Integer a = 1; Integer b = 2; swap(a, b); System.out.println("a=" + a + " b=" + b); } } 

Je pense qu’il faut imprimer a = 2 b = 1, mais le contraire est indiqué. Donc, évidemment, la méthode swap ne change pas les valeurs a et b. Pourquoi?

Cela n’a rien à voir avec l’immuabilité des entiers; cela a à voir avec le fait que Java est Pass-by-Value , Dammit! (Pas agacé, juste le titre de l’article: p)

En résumé: vous ne pouvez pas vraiment créer une méthode d’échange en Java. Il vous suffit de faire le swap vous-même, où que vous en ayez besoin; ce qui ne fait que trois lignes de code de toute façon, donc ça ne devrait pas être un problème 🙂

  Thing tmp = a; a = b; b = tmp; 

Tout en Java est passé par valeur et les valeurs des variables sont toujours des primitives ou des références à l’object.

Comme Svish et d’autres l’ont souligné, il s’agit d’un appel par valeur, et non par référence en Java. Comme vous n’avez pas de pointeurs en Java, vous avez besoin d’une sorte d’object titulaire pour permuter les valeurs de cette manière. Par exemple:

 static void swap(AtomicReference a, AtomicReference b) { Integer c = a.get(); a.set(b.get()); b.set(c); } public static void main(Ssortingng[] args) { AtomicReference a = new AtomicReference(1); AtomicReference b = new AtomicReference(2); System.out.println("a = " + a); System.out.println("b = " + b); swap(a, b); System.out.println("a = " + a); System.out.println("b = " + b); } 

Si vous souhaitez implémenter une méthode de swap pour les objects Integer, vous devez envelopper les valeurs dans un tableau (ou ArrayList) et échanger dans le tableau. Voici une adaptation de votre code:

 public class Main { static void swap (Integer[] values) { if ((values == null) || (values.length != 2)) { throw new IllegalArgumentException("Requires an array with exact two values"); } Integer t = values[0]; values[0] = values[1]; values[1] = t; } public static void main(Ssortingng[] args) { Integer a = 1; Integer b = 2; Integer[] integers= new Integer[]{a,b}; swap(integers); System.out.println("a=" + integers[0] + " b=" + integers[1]); } } 

(Juste ajouté cette réponse parce que Svish a mentionné que “Vous ne pouvez pas vraiment faire une méthode d’échange en Java” fg )

Vous devrez passer les parameters par référence, ce qui n’est pas possible en Java. De plus, les entiers sont des inmutables, vous ne pouvez donc pas échanger les valeurs car vous n’avez pas de méthode setValue.

Les entiers sont immuables – vous ne pouvez pas changer leurs valeurs. Le swap qui se produit dans la fonction swap concerne les références, pas les valeurs.

Vous devez renvoyer les deux références dans un tableau pour obtenir ce que vous voulez

 static Integer[] swap(Integer a, Integer b) { return new Integer[]{b, a}; } public static void main(Ssortingng[] args) { Integer a = 1; Integer b = 2; Integer[] intArray = swap(a, b); a = intArray[0]; b = intArray[1]; System.out.println("a=" + a + " b=" + b); } 

Si Integer avait une méthode setValue, vous pourriez faire quelque chose comme ceci.

 static void swap(Integer a, Integer b) { int temp = a.intValue(); a.setValue(b.intValue()); b.setValue(temp); } 

Mais ce n’est pas le cas – alors, pour obtenir ce que vous voulez, retournez un tableau.

Utiliser l’opérateur XOR est une très mauvaise idée:

Tout d’abord, c’est beaucoup moins lisible. Deuxièmement, il y a eu des moments où c’était plus rapide, mais de nos jours, c’est le contraire. Voir

Wikipédia

pour référence.

Comme tous les gars l’ont mentionné, il s’agissait d’une chose pass-by-value.

Juste aimé append: vous pouvez utiliser cette méthode pour échanger des entiers GLOBAL.

 private void swap (){ a ^= b; b ^= a; a ^= b; } 

Il élimine l’utilisation d’une autre variable, et c’est juste plus cool 🙂

Code Java:

 class swap { int n1; int n2; int n3; void valueSwap() { n3 = n1; n1 = n2; n2 = n3; } public static void main(Ssortingng[] arguments) { Swap sortingal = new Swap(); sortingal.n1 = 2; sortingal.n2 = 3; System.out.println("sortingal.n1 = " + sortingal.n1); System.out.println("sortingal.n2 = " + sortingal.n2); sortingal.valueSwap(); System.out.println("sortingal.n1 = " + sortingal.n1); System.out.println("sortingal.n2 = " + sortingal.n2); } } 

Sortie:

 sortingal.n1 = 2 sortingal.n2 = 3 sortingal.n1 = 3 sortingal.n2 = 2 

Utilisation du scanner:

 import java.util.*; public class Swap { public static void main(Ssortingng[] args){ int i,temp,Num1,Num2; Scanner sc=new Scanner(System.in); System.out.println("Enter Number1 and Number2"); Num1=sc.nextInt(); Num2=sc.nextInt(); System.out.println("Before Swapping Num1="+Num1+" Num2="+Num2); temp=Num1; Num1=Num2; Num2=temp; System.out.println("After Swapping Num1="+Num1+" Num2="+Num2); } }