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 @   晚觉入海  阅读(85)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
Document
点击右上角即可分享
微信分享提示