package test;
import java.lang.reflect.Field;
/**
* 交换两个数字的相关知识点
* 1、Integer a = 1;编译后可以看到装箱操作Integer.valueOf(1);
* 2、Integer.valueOf(1) 从缓存数组[-128,127]里取出下标为129的值1;
* 3、如果调field.setAccessible(true)会跳过权限检查,否则会检查访问权限
*
* @author lenovo
*
*/
public class TestIntegerSwap {
public static void main(String[] args) {
Integer a = 1;//装箱valueOf
Integer b = 2;
System.out.println("swap1交换前:a = "+a+",b="+b);
swap1(a, b);
System.out.println("swap1交换后:a = "+a+",b="+b);
System.out.println("****************分割线******************");
System.out.println("swap2交换前:a = "+a+",b="+b);
swap2(a, b);
System.out.println("swap2交换后:a = "+a+",b="+b);
}
private static void swap1(int num1,int num2){
int temp = num1;
num1 = num2;
num2 = temp;
}
private static void swap2(int num1,int num2){
try {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
int temp = num1;
field.set(num1, num2);
field.set(num2, new Integer(temp));//这个new 就不会从缓存数组里取,如果从缓存数组里取的话数组下标129的值是2,不是1了。
//上面的代码可以用field.setInt(num2, temp);替换
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:swap1()方法有问题,swap2()方法可以实现交换
swap1交换前:a = 1,b=2
swap1交换后:a = 1,b=2
****************分割线******************
swap2交换前:a = 1,b=2
swap2交换后:a = 2,b=1