**今天我们来讨论;方法中的形参为基本数据类型和数组的情况
首先先给大家看一个案例:(冒泡排序)
测试代码:
package com.算法;
import java.util.Arrays;
public class Test01 {
public static void main(String[] args) {
int[] arr = {6, 9, 5, 8, 7, 4, 2, 0};
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
结果:
由于此过程中要实现相邻数组元素的交换,所以把该功能单独抽取出来,交换的功能很简单,但是却容易出现误区,下面请看:
情况一:
这是比较容易出错的情况,大家请看代码:
测试代码:
package com.算法;
import java.util.Arrays;
public class Test02 {
public static void main(String[] args) {
int[] arr = {6, 9, 5, 8, 7, 4, 2, 0};
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
exChang(arr[j], arr[j + 1]);
}
}
}
System.out.println(Arrays.toString(arr));
}
public static void exChang(int a, int b) {
int tem = a;
a = b;
b = tem;
}
}
结果:
我们此时看到结果,并没有达到我们想要的结果进行元素交换,这是为什么呢?
原因如下:
- 当我们调用exChang(int a, int b)方法时,只有实参单向传递值给行参而已,即 a =arr[j] 和 b = arr[j+1]。而没有谁对arr[j]和arr[j+1]进行赋值或者改变。所以交换的只是两个形参交换完就完事了。
那我们想用方法来解决这个问题因该怎么解决呢?下面请看:
情况二:
正确的解决方法应该是要把数组进行传进去,大家请看代码:
测试代码:
package com.算法;
import java.util.Arrays;
public class Test03 {
public static void main(String[] args) {
int[] arr = {6, 9, 5, 8, 7, 4, 2, 0};
int[] arr1 = find2(arr);
System.out.println(Arrays.toString(arr1));
}
public static int[] find2(int[] arr) {
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < arr.length - 1; j++) {//最后一个不用比
if (arr[j] > arr[j + 1]) {
exChang2(arr,j, j + 1);
}
}
}
return arr;
}
public static void exChang2(int[] arr , int a, int b) {
int tem;
tem = arr[a];
arr[a] = arr[b];
arr[b] = tem ;
}
}
结果:
很高兴,这个时候得出了我们想要的结果,这到底是为什么呢?
原因:
- 这里我们看到,这时我们传进了数组,还有数组的下标
- 传入数组的时候其实是传进了数组的地址,我们只是将操作的对象指向了数组的内部,实际上没有改变地址。因此传入数组时可以达到修改数组元素的目的
- 同样我们可以拓展开来,只要传入的是引用数据类型都可以对其内容进行修改