java 如何实现swap功能??

使用java语言实现Swap函数,该函数用于交换两个Integer类型

阅读 14.8k
4 个回答

C/C++中swap功能的本质:通过传递变量地址(指针或引用)来交换变量地址中的值。

Java标榜其中对C/C++一个很大的改进就是:Java对程序员屏蔽了变量地址的概念,减少指针误用。

在Java世界中函数或者叫方法的入参都是通过值拷贝的方式进行传递:

  1. 原始类型(char,int,double等)都是通过直接拷贝变量值传参;
  2. 对象类型都是通过引用拷贝(跟C++中引用不同)传参,通过该引用能够更改其指向的对象内部值,但是更改该引用值,仅对函数内部可见,函数外部的实参依然没有改变;

所以正常来说,Java不能实现C/C++中的swap功能。

关键是要传引用,但java又不支持&,所以可以考虑传数组或是对象,例如外部内联方式

@halty说的极好.

我看你问题里说的是 交换两个Integer类型, 按理这里传了两个对象的引用, 可以对 对象本身做一些操作. BUT, Integer对象是不可变的, 它的API没有任何对内部值最修改的 方法; 看一下源码也知道, 内部的int也是final的:

private final int value;

如果我们非要做 对int的 swap, 那么只有自己定义个 int型的 wrapper了:

class MyInteger{

    private int value;

    public MyInteger(int i) {this.value=i;}

    public void setValue(int value){this.value=value;}

    public int getValue(){return this.value;}

    public static void swapMyInteger(MyInteger a, MyInteger b){
        MyInteger c=new MyInteger(a.getValue());
        a.setValue(b.getValue());
        b.setValue(c.getValue());
    }
}

Java的对象传递是引用传递,所以没法实现swap功能。
举个栗子,公司里的雇员用类对象来表示

class employee{
    String job;
    int salary;
}

当出现工作调动,两个员工要互相交换岗位,你一定会交换他们的工作和薪水(类成员),而不是交换这两个员工的灵魂(对象地址,我们假设肉体和灵魂是分开的)。
对象比喻起来就像是一个人(当然也可以描述成一辆车、一头牛)一样,你能改变的是描述该个体的外在(衣服,工作等),但你没法改变他的灵魂(也没有必要)。如果改变了他的灵魂(内存地址交换),那他就不在是“他”了。
请再认真考虑一下“面向对象”的意义。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏