Java不能实现交换函数,无语
作者:Alex Wang
链接:https://www.zhihu.com/question/54443277/answer/139629723
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接: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放弃指针带来的副作用吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?