Java基础

您所在的位置:网站首页 swap引用 Java基础

Java基础

2023-12-28 06:26| 来源: 网络整理| 查看: 265

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

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

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

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

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3