为什么Java没有提供一个简单的交换函数?

4

每次我想交换两个值时,都需要使用临时变量进行实际的交换。为什么Java不给我们一个方便的方法,在任何类中仅仅交换两个变量的值呢?


4
那么问题是什么?为什么Java没有针对这个的东西?去问Java的创造者。 - shift66
请参见https://dev59.com/_XA65IYBdhLWcg3wzx9l和https://dev59.com/gXE95IYBdhLWcg3wPrgI。 - David Heffernan
@Ademiban 请检查一下你的语法。 - Juvanis
4
我记不得上一次在真实的代码中实际上需要交换变量的值了...(除了在 Stack Overflow 上发布的代码片段之外 ;) ) - Andreas Dolk
1
@Andreas_D - 有人可能会认为你无法记住的原因是你下意识地排除了需要使用“交换”(swap)的“解决方案”。 :-) - Stephen C
2个回答

11

Java是传值的。这就是为什么你不能创建一个简单的交换方法(ref)


但是,您可以将引用包装在另一个对象中并交换内部引用:

public static void main(String[] args) {
    Ref<Integer> a = new Ref<Integer>(1);
    Ref<Integer> b = new Ref<Integer>(2);

    swap(a, b);

    System.out.println(a + " " + b); // prints "2 1"
}

public static <T> void swap(Ref<T> a, Ref<T> b) {
    T tmp = a.value;
    a.value = b.value;
    b.value = tmp;
}

static class Ref<T> {
    public T value;

    public Ref(T t) {
        this.value = t;
    }

    @Override
    public String toString() {
        return value.toString();
    }
}

3

Java没有提供这样的方法,因为这是不可能的。变量是按值传递给方法的。是的,即使这些是对象。在这种情况下,我们通过值传递对象的引用。因此,您无法在接收此变量作为参数的方法内更改源变量的值:

int a = 5;
int b = 6;
swap(a, b);
// a is still 5, b is still 6!


void swap(int first, int second) {
    int tmp = first;
    first = second;
    second = tmp;
}

如其他地方所提到的,可以通过将要交换的值包装在对象中轻松实现此操作。 - David Bandel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接