Подтвердить что ты не робот

Java: Почему этот метод обмена не работает?

У меня есть следующий код:

public class Main {

    static void swap (Integer x, Integer y) {
        Integer t = x;
        x = y;
        y = t;
    }

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

Я ожидаю, что он напечатает a = 2 b = 1, но он напечатает противоположное. Таким образом, очевидно, что метод подкачки не меняет значения a и b. Почему?

4b9b3361

Ответ 1

Это не имеет никакого отношения к неизменяемости целых чисел; это связано с тем, что Java - это пропуск по значению, Dammit! (Не раздражает, просто название статьи: p)

Подводя итог: вы действительно не можете сделать swap-метод в Java. Вам просто нужно сделать своп самостоятельно, где бы вы ни нуждались; это всего лишь три строки кода, поэтому не должно быть такой большой проблемы:)

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

Ответ 2

Все в Java передается по значению, а значения переменных всегда являются примитивами или ссылками на объект.

Ответ 3

Как сказал Svish и другие, он вызывает по значению, а не по ссылке в Java. Поскольку у вас нет указателей на Java, вам нужен какой-то объект-держатель, чтобы действительно менять значения таким образом. Например:

static void swap(AtomicReference<Integer> a, AtomicReference<Integer> b) {

    Integer c = a.get();
    a.set(b.get());
    b.set(c);

}

public static void main(String[] args) {

    AtomicReference<Integer> a = new AtomicReference<Integer>(1);
    AtomicReference<Integer> b = new AtomicReference<Integer>(2);

    System.out.println("a = " + a);
    System.out.println("b = " + b);

    swap(a, b);

    System.out.println("a = " + a);
    System.out.println("b = " + b);

}

Ответ 4

Если вы хотите реализовать метод подкачки для объектов Integer, вы должны обернуть значения в массив (или ArrayList) и поменять его внутри массива. Вот адаптация вашего кода:

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(String[] args) {
       Integer a = 1;
       Integer b = 2;
       Integer[] integers= new Integer[]{a,b};
       swap(integers);
       System.out.println("a=" + integers[0] + " b=" + integers[1]);
    } 
}

(Просто добавил этот ответ, потому что Svish упомянул, что "вы действительно не можете сделать swap-метод в Java" fg)

Ответ 5

Вам нужно будет передать параметры по ссылке, что невозможно в java. Также целые числа являются inmutables, поэтому вы не можете обменивать значения, поскольку у вас нет метода setValue.

Ответ 6

Целое - неизменное - вы не можете изменять свои значения. Перестановка, которая происходит внутри функции свопинга, относится к ссылкам, а не значениям.

Вам нужно будет вернуть обе ссылки в массиве для достижения желаемого

static Integer[] swap(Integer a, Integer b) {
   return new Integer[]{b, a};
}

public static void main(String[] 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);
} 

Если Integer имеет метод setValue, вы можете сделать что-то вроде этого.

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

Но это не так, чтобы достичь того, чего вы хотите, верните массив.

Ответ 7

Как все ребята упомянули о своей вещи "Повсюду".

Просто понравилось: вы можете использовать этот метод замены GLOBAL-целых чисел.

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

Это исключает использование другой переменной, а ее просто кулер:)

Ответ 8

Использование оператора XOR - очень плохая идея:

Во-первых, это гораздо менее читаемо. Во-вторых, были времена, когда это было быстрее, но в настоящее время наоборот. См.

Wikipedia

для справки.

Ответ 9

Код Java:

class swap {

    int n1;
    int n2;
    int n3;

    void valueSwap() {
        n3 = n1;
        n1 = n2;
        n2 = n3;
    }

    public static void main(String[] arguments) {

        Swap trial = new Swap();
        trial.n1 = 2;
        trial.n2 = 3;

        System.out.println("trial.n1 = " + trial.n1);
        System.out.println("trial.n2 = " + trial.n2);

        trial.valueSwap();

        System.out.println("trial.n1 = " + trial.n1);
        System.out.println("trial.n2 = " + trial.n2);

    }
}

Вывод:

trial.n1 = 2
trial.n2 = 3
trial.n1 = 3
trial.n2 = 2

Ответ 10

Использование сканера:

import java.util.*;
public class Swap {
 public static void main(String[] 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);
 }    
}