java中可用异或运算实现整型变量不借助临时变量的交换,但仅适用于int/long等整数类型,不支持浮点数、对象及包装类,且存在可读性差、自交换归零、数组元素交换失效等风险,工程中应优先使用临时变量或collections.swap。

Java 中可以用位运算(异或 ^)实现两个整型变量的**不借助临时变量**的交换,但需注意适用范围和潜在陷阱。
原理:利用异或的自反性和结合律
异或满足:
• a ^ a = 0
• a ^ 0 = a
• a ^ b ^ b = a(结合律 + 自反性)
所以对两个变量 a 和 b,执行以下三步:
a = a ^ b-
b = a ^ b→ 实际是(a^b) ^ b = a -
a = a ^ b→ 实际是(a^b) ^ a = b
标准写法(仅适用于 int/long 等整数类型)
示例代码:
int a = 5, b = 9; a = a ^ b; b = a ^ b; // 此时 b 变成原 a a = a ^ b; // 此时 a 变成原 b
执行后:a == 9, b == 5。
重要限制与风险
-
不能用于浮点数、对象或包装类(如
Integer),因为 `^` 不支持非整数类型,且自动拆箱可能引发NullPointerException -
不能对同一变量自身异或交换(如
a = a ^ a; a = a ^ a; ...),会导致值变为 0 - 可读性差、维护成本高,现代 JVM 对临时变量优化极好,性能差异几乎为零
-
不适用于数组元素或字段直接交换,例如
arr[i] = arr[i] ^ arr[j]会因求值顺序或重复读取导致逻辑错误
更安全、通用的替代方案
日常开发中推荐使用传统方式:
- 基本类型:用临时变量(清晰、无副作用)
- 对象引用:同样用临时变量,或封装为工具方法
- 集合元素交换:用
Collections.swap(list, i, j)
位运交换是算法题中的技巧,在工程代码中不建议使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











