java中可用异或运算符(^)交换两个整型变量:a=a^b; b=a^b; a=a^b;原理基于a^a=0、a^0=a及结合律;仅适用于整数类型,不可用于浮点数或对象,且需避免自交换和表达式副作用。

Java 中可以用位运算符 异或(^) 实现两个整型变量的快速交换,无需额外临时变量,且效率高、代码简洁。
原理:利用异或的数学性质
异或运算满足以下三条关键性质:
- a ^ a = 0(相同数异或为 0)
- a ^ 0 = a(任何数与 0 异或等于自身)
- a ^ b ^ b = a(异或满足结合律和交换律)
因此,对两个整数 a 和 b 执行三步异或操作即可完成交换:
a = a ^ b;b = a ^ b; // 此时 a 是原 a^b,所以 b = (a^b) ^ b = a
a = a ^ b; // 此时 b 已是原 a,所以 a = (a^b) ^ a = b
标准写法(推荐)
假设初始值 a = 5, b = 3:
int a = 5, b = 3; a = a ^ b; // a → 5^3 = 6 b = a ^ b; // b → 6^3 = 5(得到原 a) a = a ^ b; // a → 6^5 = 3(得到原 b)
执行后:a = 3, b = 5,完成交换。
注意事项与限制
- 仅适用于整数类型(byte、short、int、long),不支持 float、double、String 或对象
-
不能用于同一变量自交换,例如
a = a ^ a; a = a ^ a;会导致结果全为 0 - 可读性较低,维护时不如临时变量直观,建议加注释说明意图
- 在现代 JVM 中,性能优势已不明显;编译器优化下,传统方式(用临时变量)和异或方式生成的字节码效率接近
安全写法(避免副作用)
若变量是表达式(如数组元素或带副作用的 getter),应先提取再运算,防止重复求值:
int x = arr[i], y = arr[j]; x = x ^ y; y = x ^ y; x = x ^ y; arr[i] = x; arr[j] = y;
直接写 arr[i] = arr[i] ^ arr[j]; 可能因多次访问引发意外行为(尤其在多线程或有 getter 逻辑时)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











