Java 中一行交换两个变量

2025 年 1 月 7 日 | 阅读 3 分钟

交换两个变量是编程中的一项常见任务,通常涉及三个步骤:将一个变量的值存储在临时变量中,将第二个变量的值赋给第一个变量,然后将临时变量的值赋给第二个变量。然而,在某些编程语言和场景中,可以在一行内更简洁地完成。在 Java 中,可以使用算术运算或位运算来实现。在本节中,我们将讨论如何在一行内交换两个变量。

使用算术运算

使用算术运算在不使用临时变量的情况下交换两个变量的想法基于加法和减法的性质。

文件名:SwapWithArithmetic.java

输出

 
Before swap:
a = 5
b = 10
After swap:
a = 10
b = 5   

解释

通过使用表达式 a = a + b - (b = a) 在一行内完成交换。最初,数字 5 和 10 分别被赋给 a 和 b。表达式的操作涉及三个步骤:首先使用 a + b 计算 a 和 b 的和,得到 15,然后将其赋给 a。同时,由于 (b = a),b 被赋给 a 在加法之前的值 (5)。因此,a 现在持有 15,b 持有 5。在最后一步,a = 15 - 5 将 b 的初始值 (10) 赋给 a。交换后,b 持有 5,a 持有 10。

使用按位异或运算

另一种方法涉及按位异或运算,它也可以在不使用临时变量的情况下交换两个整数。

文件名:SwapWithXOR.java

输出

 
Before swap:
a = 5
b = 10
After swap:
a = 10
b = 5   

解释

通过语句 a = a ^ b ^ (b = a) 使用异或运算来实现交换。起初,a 是 5,b 是 10。异或运算的工作方式如下:首先,a ^ b 计算 a 和 b 的异或,得到 15,并暂时存储在 a 中。同时,(b = a) 将 a 的初始值 (5) 赋给 b。

因此,a 现在持有 15,b 持有 5。在最后一步,通过使用 a = 15 ^ 5 重新计算异或,将 b 的原始值 (10) 赋给 a。交换后,b 持有 5,a 持有 10。这种方法可以避免算术运算中出现的溢出问题,并且适用于整数类型。

时间复杂度

上述交换操作方法的 time complexity (时间复杂度) 为 O(1)。异或运算和算术运算都是常数时间操作。一系列的异或运算和赋值操作都需要固定的时间,与输入值无关。

空间复杂度

上述方法的 space complexity (空间复杂度) 为 O(1)。这两种方法除了输入变量 a 和 b 之外,不需要任何额外的内存。交换是就地执行的,没有使用额外的变量或数据结构。

结论

在 Java 中,可以使用按位异或运算或算术运算在一行内交换两个变量。这些技术提供了一种不使用临时变量即可进行交换的简洁方法;然而,它们存在某些缺点,并且需要仔细考虑可读性和类型安全。与任何编程方法一样,保持代码的可管理性和可理解性需要在巧妙性和清晰度之间取得平衡。