讨论方法中的行参的一些特殊情况

**今天我们来讨论;方法中的形参为基本数据类型和数组的情况

首先先给大家看一个案例:(冒泡排序)

测试代码:

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 ;
    }
}

结果:
在这里插入图片描述
很高兴,这个时候得出了我们想要的结果,这到底是为什么呢?

原因:

  • 这里我们看到,这时我们传进了数组,还有数组的下标
  • 传入数组的时候其实是传进了数组的地址,我们只是将操作的对象指向了数组的内部,实际上没有改变地址。因此传入数组时可以达到修改数组元素的目的
  • 同样我们可以拓展开来,只要传入的是引用数据类型都可以对其内容进行修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值