как поменять местами целочисленный тип в java

Как я могу поменять местами значения i,j в функции swap2():

enter code here public class pass_by_ref {
        public static void swap(Integer i, Integer j)  //this will not change i j values in main 
        {
        Integer temp = new Integer(i);
        i = j;
        j = temp;
        }
        public static void swap2(Integer i, Integer j) 
        {
        i = 20;   //as i am setting i value to 20 why isn't it reflected in main and same for j
        j = 10;
        }
        public static void main (String[] args) throws java.lang.Exception
        {
        Integer i = new Integer(10);
        Integer j = new Integer(20);
        swap(i, j);
        System.out.println("i = " + i + ", j = " + j);
        swap2(i, j);
        System.out.println("i = " + i + ", j = " + j);
        }
        }

Выходы:

        i=10,j=20
        i=10,j=20;

Я думаю, что Integer i=new Integer(10) создает объект i со значением 10, поэтому, когда я пишу i=20;j=10 в swap2(), я устанавливаю там значения!.. так почему это не работает, я знаю, что swap() не изменит значения i,j, но почему swap2() нет работающий? Ну какое изменение сделать в swap2() чтобы значения поменялись местами.


person rashik    schedule 21.08.2015    source источник
comment
Вы не можете. Java передается по значению. Написать метод для этого невозможно.   -  person Paul Boddington    schedule 22.08.2015
comment
Могу ли я создать класс с двумя целыми числами i и j, а затем создать объект этого класса, а затем поменять местами значения?   -  person rashik    schedule 22.08.2015
comment
Да, вы можете сделать это или использовать массив, как в ответе. Это работает, потому что массивы изменяемы.   -  person Paul Boddington    schedule 22.08.2015
comment
Однажды я написал изменяемый класс-оболочку для такой проблемы, если вы не хотите использовать возвращаемый массив (по какой-либо причине), вы можете использовать этот подлый трюк.   -  person redxef    schedule 22.08.2015


Ответы (1)


Java всегда передается по значению, а Integer является неизменяемым, и вы не можете обновить ссылку вызывающего абонента. Вы можете использовать массив (значения, хранящиеся в массиве, являются изменяемыми). Поскольку массив представляет собой Object, его значение передается значением ссылки на экземпляр массива, и, таким образом, вы можете изменять значения в массиве. Что-то типа,

static void swap(int[] arr, int i, int j) {
    // error checking
    if (arr == null || i == j) {
        return;
    }
    if (i < 0 || j < 0 || i > arr.length - 1 || j > arr.length - 1) {
        return;
    }
    // looks good, swap the values
    int t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
}

и тогда вы могли бы назвать это как

public static void main(String[] args) {
    int[] arr = { 10, 20 };
    System.out.println(Arrays.toString(arr));
    swap(arr, 0, 1);
    System.out.println(Arrays.toString(arr));
}

А затем (в выводе) значения меняются местами.

[10, 20]
[20, 10]
person Elliott Frisch    schedule 21.08.2015
comment
хорошо, спасибо... Но создает ли Integer i=new Integer(10) объект или это просто примитивный тип данных? - person rashik; 22.08.2015
comment
@rashik Integer — это неизменяемый тип оболочки в Java. Кроме того, я считаю, что существует пул экземпляров, гарантирующий, что Integer(10) == 10. - person Elliott Frisch; 22.08.2015
comment
Забавный трюк, чтобы поменять местами 2 целых числа без использования третьей переменной: a=a+b;b=a-b;a=a-b; - person Laurent S.; 22.08.2015