方案一:不使用第三个变量
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