Java基础--swap方法

Java基础--swap方法


Java中的swap()

通常我们在交换两个变量(如a, b)的时候会采用一个临时变量temp,用于存储变量a的值,然后将变量b的值赋给变量a,最后将temp赋给变量b完成两个变量的交换。

public static void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

具体的实现:

图1

图 1

执行结果可以发现方法中的变量a、b完成了交换,但是实际的变量a、b并没有完成交换:

图2

图 2

Java中变量在内存的状态

当我们声明一个变量的时候,就会在内存中开辟一个空间用于存储这个变量的值。对于基本数据类型(如int等)就直接存对应的二进制数;而对于对象则存储一个指向堆的地址。

在上述的方法中,在内存中是这样的:

图3

图 3

图4

图 4

图5

图 5

  1. 在调用方法前,栈中只用变量a和b。

  2. 在调用方法swap时,将方法的形参a、b(也就是副本a和副本b)存入栈中。这里的a和b并不是指在main方法中声明的变量a和b,而是方法swap的局部变量。将副本a、副本b和局部变量temp进行交换。

  3. 在调用方法后,局部变量失去意义(局部变量只在对应的方法中有效),故从栈中弹出。

    这里举例变量是基本数据类型的例子,如果变量是对象类型则需考虑堆

现在我们来简单考虑一下类型是对象的情况

public static void swap(Object a, Object b) {
    Object temp = a;
    a = b;
    b = temp;
}

如果是对象,在栈中存的便是指向对应堆的地址,如图:

图6

图 6

图7

图 7

图8

图 8

所以改变的是局部变量(副本a、b)的地址引用,而实际的对象a和b不变。

如何在Java中实现swap
  • 方法一:传数组

    public static void swap(int[] data, int a, int b) {
        
        int temp = data[a];
        data[a] = data[b];
        data[b] = temp;
    }
    

    图9

    图 9

    注:可能有的小伙伴对这里的 int[] data 有所疑问,会认为其作为局部变量会没有效果。可以结合上图 7,int[]是一个对象,那么它的局部变量data(也就是形参)和实际传入的data都指向同一个地址。而它后续的操作是基于地址的操作,故data数组内部发生了交换。

  • 方法二:包装类

    图10

    图 10


感谢阅读,欢迎指正 ( ̄▽ ̄)~■干杯□~( ̄▽ ̄)

posted @ 2021-03-06 19:23  二狗快乐水  阅读(8025)  评论(0编辑  收藏  举报