Java不能实现交换函数,无语

作者:Alex Wang
链接:https://www.zhihu.com/question/54443277/answer/139629723
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<h1>结论是不行<h1>

java的参数传递分为两种,基本类型和String,是传值,这样函数内部的改变与外部参数无关。

数组以及类的实例,是传引用,在函数内部对该引用的操作可以影响到外部参数,但是无法将该引用赋值对象的改变传递到函数体外。

因此这个形式的void swap(Object obj1, Object obj2)函数是肯定不能实现的,至于变通的方案。

参照上面某人的回答写了个:

class SomeObject {
int flag;

    public SomeObject(int i) {
this.flag = i;
    }

@Override
    public String toString() {
return "obj(flag=" + flag + ")";
    }
}

class ObjectPointer<T> {
T pointer;

    public ObjectPointer(T value) {
this.pointer = value;
    }

public T getPointer() {
return pointer;
    }

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

public class SwapTest {
public static void main(String[] args) {
        SomeObject obj1 = new SomeObject(1);
        SomeObject obj2 = new SomeObject(2);
        System.out.println("before swap:");
        System.out.println("obj1=" + obj1);
        System.out.println("obj2=" + obj2);


        ObjectPointer<SomeObject> p1 = new ObjectPointer<>(obj1);
        ObjectPointer<SomeObject> p2 = new ObjectPointer<>(obj2);
        ObjectPointer.swap(p1, p2);

        obj1 = p1.getPointer();
        obj2 = p2.getPointer();
        System.out.println("after swap:");
        System.out.println("obj1=" + obj1);
        System.out.println("obj2=" + obj2);
    }
}


我自己看了都觉得别扭,还不如老老实实写上三行赋值语句。 其他的解决方案如Collections.swap也是一样的繁杂。swap不能实现也是java放弃指针带来的副作用吧。

posted @ 2022-03-09 20:57  晚觉入海  阅读(94)  评论(2)    收藏  举报
Document