Java中可用异或实现两整数交换,原理是a^a=0、a^0=a及结合律,但仅适用于不同变量的同类型整数;实际开发推荐临时变量,因其可读性强、支持所有类型、无自交换归零等风险。

Java 中可以用位运算(异或 ^)实现两个整数的交换,无需额外变量,但仅适用于 同类型整数 且 不能是同一个变量(即不能 `a ^= a` 这样操作)。
原理:利用异或的自反性和结合律
异或满足:
- 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、double、对象引用等)
- 无副作用,不依赖数值特性
- 避免自交换(a 和 b 指向同一内存地址)导致归零问题
位运算交换示例(仅限 int)
正确用法(a、b 是不同变量):
int a = 5, b = 9;a ^= b;
b ^= a;
a ^= b;
// 此时 a == 9, b == 5
⚠️ 错误情况(自引用):
立即学习“Java免费学习笔记(深入)”;
int a = 5;a ^= a; // 结果为 0 —— 不是交换,是清零!
为什么不建议在生产代码中使用?
除可读性差外,还有几个实际风险:
- JVM 优化可能让位运算和临时变量性能几乎无差别
- 对 long 类型需确保是 64 位异或(Java 中
long支持 ^,但若误用int强转会丢精度) - 无法用于浮点数(
float/double不支持位运算) - 若参与交换的变量有副作用(如数组索引、getter 方法调用),三步表达式顺序易出错


















