Java基础:交换两数的方法

本文探讨了在Java中错误地交换两个数的方法,如直接交换和使用包装类,然后详细介绍了正确的交换方法,包括使用临时变量、数组加减计算和异或运算。重点解析了异或运算交换的原理,强调了在实际编程中,虽然异或运算效率高,但为了代码可读性,推荐使用临时变量。同时提醒注意加减计算可能导致的数据溢出问题。

Java基础:交换两数的方法

Java 在有参函数调用时,如果参数传递的是基本类型,进行的是 值传递,而不是 地址 或 引用传递。

1、【错误示范】

1.1、直接交换

public class SwapNumber {

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

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("交换前:a = " + a + ", b = " + b);
        swap(a, b);
        System.out.println("交换后:a = " + a + ", b = " + b);
    }
}

输出结果:

交换前:a = 10, b = 20
交换后:a = 10, b = 20

1.2、包装类交换

public class SwapNumber {

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

    public static void main(String[] args) {
        Integer a = 10;
        Integer b = 20;
        System.out.println("交换前:a = " + a + ", b = " + b);
        swap(a, b);
        System.out.println("交换后:a = " + a + ", b = " + b);
    }
}

输出结果:

交换前:a = 10, b = 20
交换后:a = 10, b = 20

2、【正确示范】

2.1、数组 + 临时变量

public class SwapNumber {

    public static void swap(int[] arr) {
        int temp = arr[0];
        arr[0] = arr[1];
        arr[1] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {10, 20};
        System.out.println("交换前:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
        swap(arr);
        System.out.println("交换后:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
    }
}

输出结果:

交换前:arr[0] = 10, arr[1] = 20
交换后:arr[0] = 20, arr[1] = 10

2.2、数组 + 加减计算

public class SwapNumber {

    public static void swap(int[] arr) {
        arr[0] = arr[0] + arr[1];
        arr[1] = arr[0] - arr[1];
        arr[0] = arr[0] - arr[1];
    }

    public static void main(String[] args) {
        int[] arr = {10, 20};
        System.out.println("交换前:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
        swap(arr);
        System.out.println("交换后:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
    }
}

输出结果:

交换前:arr[0] = 10, arr[1] = 20
交换后:arr[0] = 20, arr[1] = 10

2.3、数组 + 异或运算

  • 一个数异或 自己 的结果为 0
  • 一个数异或 0 的结果为 自己
  • 一个数异或 1 的结果为 自己的反码
public static void swap(int[] arr) {
    arr[0] = arr[0] ^ arr[1];
    arr[1] = arr[0] ^ arr[1];
    arr[0] = arr[0] ^ arr[1];
}

public static void main(String[] args) {
    int[] arr = {10, 20};
    System.out.println("交换前:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
    swap(arr);
    System.out.println("交换后:arr[0] = " + arr[0] + ", arr[1] = " + arr[1]);
}

输出结果:

交换前:arr[0] = 10, arr[1] = 20
交换后:arr[0] = 20, arr[1] = 10

异或运算交换两数的原理:

按位异或运算是指:数字在二进制形式上,同位上进行比较,相同为 0,不同为 1。

即 1 ^ 1 == 0、1 ^ 0 == 1、0 ^ 1 == 1、0 ^ 0 == 1

a = a ^ b; // 语句 1
b = a ^ b; // 语句 2
a = a ^ b; // 语句 3
  • 语句 1 可以看做把变量 a、b 的值临时存储到变量 a 中(一种理解方式——
  • 语句 2 利用 b ^ b == 0 消去了 b,也就是 b = a
  • 语句 3 也是利用 自己异或自己等于 0,消去了 a,从而 a = b

2.4、成员变量

public class SwapNumber {
    int a;
    int b;

    public void swap(int a, int b) {
        this.a = b;
        this.b = a;
    }

}

class SwapNumberTest {
    public static void main(String[] args) {
        SwapNumber obj = new SwapNumber();
        obj.a = 10;
        obj.b = 20;
        System.out.println("交换前:a = " + obj.a + ", b = " + obj.b);
        obj.swap(obj.a, obj.b);
        System.out.println("交换后:a = " + obj.a + ", b = " + obj.b);
    }
}

输出结果:

交换前:a = 10, b = 20
交换后:a = 20, b = 10

3、总结

  • 【数组 + 临时变量 】是最常见的,可读性高,但是需要在内存中存放临时变量,但是对于现在来说,需要的内存空间很小,而且存放临时变量的内存很快就会释放,不存在问题。

  • 【数组 + 加减计算】 有缺陷,当两个数相加之后,可能其结果超出了变量类型能表达的最大范围,这个时候结果就会出数据溢出,不推荐使用!

  • 【数组 + 异或运算】 效率是最高的,但是可读性不是很好。

  • 在程序中尽可能的使用 【临时变量】,提高程序的可读性。但是需要了解加减计算以及异或运算的原理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值