Java中两数交换引发的值传递问题及解决方案
今天导师分享了一个有趣的代码,记录一下,让我们一起看看~
//交换两个整数
private static void swap(int i, int j) {
int temp = i;
i = j;
j = temp;
}
public static void main(String[] args) {
int i = 1;
int j = 2;
swap(i,j);
System.out.println("i:" + i);
System.out.println("j:" + j);
}
猜猜输出的是什么?
答案,i和j 的值还是没变,你答对了没
//输出结果
i:1
j:2
让我们来分析一下,这是因为值传递和引用传递引发的问题~
1、值传递
概念
实参传递给形参的是值,形参和实参在内存上是两个独立的变量, 对形参做任何修改不会影响实参
代码
下图来分析下:
通俗的讲法就是:形参
只是实参
创建的一个副本
,副本改变了,原本
当然不可能跟着改变;
再通俗的讲法就是:
小王来到饭店,看别人的红烧肉很好吃,自己也点了一份红烧肉,自己的红烧肉吃完了,那他这个红烧肉跟别人的红烧肉是一回事吗?
附上交换两个数的解决方案
使用数组实现两数交换
private static void swap(Integer[] source) {
Integer temp = source[0];
source[0] = source[1];
source[1] = temp;
System.out.println(temp == source[0]);
}
public static void main(String[] args) {
Integer i = 1;
Integer j = 2;
Integer[] source = {i, j};
swap(source);
i = source[0];
j = source[1];
System.out.println("i:" + i);
System.out.println("j:" + j);
}
使用反射实现两数交换
//使用反射交换两个整数
private static void swap(Integer i, Integer j) {
int temp = i;
try {
Field field = i.getClass().getDeclaredField("value");
field.setAccessible(true);
field.setInt(i,j);
field.setInt(j,temp);
System.out.println(temp);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Integer i = 1;
Integer j = 2;
swap(i,j);
System.out.println("i:" + i);
System.out.println("j:" + j);
}
但是发现,反射实现会引发一些问题,下篇进行说~
引用传递下次补上,有什么错误望大佬指正~