方案一:不使用第三个变量

public static void main(String[] args) {
        a ^= b;
        b ^= a;
        a ^= b;
    }

方案二:使用第三个变量

public static void main(String[] args) {
        int a = 10000;
        int b = 20000;
        int temp = a;
        a = b;
        b = temp;
    }

性能对比

测试代码
public static void main(String[] args) {
        for (int loop = 0; loop < 5; loop++) {
            int a = 10000;
            int b = 20000;

            long start1 = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                a ^= b;
                b ^= a;
                a ^= b;
            }
            long end1 = System.currentTimeMillis();
            System.out.println("方案一:不使用第三个变量 花费时间为:" + (end1 - start1));

            long start2 = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                int temp = a;
                a = b;
                b = temp;
            }
            long end2 = System.currentTimeMillis();
            System.out.println("方案二:使用第三个变量 花费时间为:" + (end2 - start2));
        }
    }
运行结果
方案一:不使用第三个变量 花费时间为:2112
方案二:使用第三个变量 花费时间为:3
方案一:不使用第三个变量 花费时间为:2003
方案二:使用第三个变量 花费时间为:0
方案一:不使用第三个变量 花费时间为:1988
方案二:使用第三个变量 花费时间为:0
方案一:不使用第三个变量 花费时间为:1987
方案二:使用第三个变量 花费时间为:0
方案一:不使用第三个变量 花费时间为:1990
方案二:使用第三个变量 花费时间为:0

通过字节码分析运行结果

0 sipush 10000			10000压入操作数栈
 3 istore_1				保存至局部变量表第1的位置
 4 sipush 20000			20000压入操作数栈
 7 istore_2				保存至局部变量表第2的位置
======================================================
 8 iconst_0				0压入操作数栈
 9 istore_3				保存至局部变量表第3的位置
10 iload_3				加载局部变量表第3的位置
11 ldc #3 <2147483647>	常量池中的2147483647压入操作数栈
13 if_icmpge 34 (+21)	循环块开始
16 iload_1				加载局部变量表第1的位置
17 iload_2				加载局部变量表第2的位置
18 ixor					执行异运算
19 istore_1				保存至局部变量表第1的位置
20 iload_2				重复上面4个操作
21 iload_1
22 ixor
23 istore_2
24 iload_1				重复上面4个操作
25 iload_2
26 ixor
27 istore_1
28 iinc 3 by 1			位置3位置局部变量自增1
31 goto 10 (-21)		回到第10行指令
======================================================
34 iconst_0				0压入操作数栈
35 istore_3				保存至局部变量表第3的位置
36 iload_3				加载局部变量表第3的位置
37 ldc #3 <2147483647>	常量池中的2147483647压入操作数栈
39 if_icmpge 56 (+17)	循环块开始
42 iload_1				加载局部变量表第1的位置
43 istore 4				保存至局部变量表第4的位置
45 iload_2				加载局部变量表第2的位置
46 istore_1				保存至局部变量表第1的位置
47 iload 4				加载局部变量表第4的位置
49 istore_2				保存至局部变量表第2的位置
50 iinc 3 by 1			位置3位置局部变量自增1
53 goto 36 (-17)		回到第36行指令
56 return