Java中可用异或运算符^交换两个整型变量值,无需额外变量或加减法,但仅适用于int类型且存在自交换为0、不支持浮点数/对象、可读性差等风险,生产环境推荐三变量法。

Java 中可以用位运算符 ^(异或) 实现两个整型变量的值交换,**无需额外变量、也不用加减法**,但仅适用于整数类型,且需注意潜在风险。
异或交换的原理
利用异或运算的三个关键性质:
- a ^ a = 0(相同数异或为 0)
- a ^ 0 = a(与 0 异或不变)
- a ^ b ^ b = a(可交换、可结合)
所以对两个变量 a 和 b 执行以下三步:
- a = a ^ b
- b = a ^ b → 即 (a^b) ^ b = a
- a = a ^ b → 即 (a^b) ^ a = b
标准写法示例
假设 int a = 5, b = 3:
a = a ^ b; // a 变为 5^3 = 6<br>b = a ^ b; // b 变为 6^3 = 5<br>a = a ^ b; // a 变为 6^5 = 3
执行后 a=3,b=5,完成交换。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
必须避开的坑
⚠️ 不能用于同一变量(自交换):如果 a 和 b 指向同一内存地址(如数组元素 a[i] 和 a[j] 且 i==j),或使用 a ^= b ^= a ^= b 这类复合表达式,会导致结果为 0。
⚠️ 不支持浮点数、对象、long(若未用 long 类型声明)等非 int 类型;对 long 需显式用 long 类型并确保操作数为 long。
⚠️ 可读性差、调试困难、无性能优势**:现代 JVM 对临时变量优化极好,异或交换反而可能妨碍 JIT 优化,实际性能并不更好。
更推荐的做法
日常开发中建议优先使用清晰安全的方式:
- 经典三变量法(通用、易懂):int t = a; a = b; b = t;
- JDK 14+ 可用记录类或封装交换逻辑,提升语义表达
- 集合/数组交换用 Collections.swap() 或手动赋值
位运算交换是理解异或特性的有趣练习,但生产代码中应以可读性、安全性和可维护性为先。

















