这个交换还挺难啊,要是在Integer缓存范围内,直接修改反射修改,会把缓存池中的Integer值都改了,要new Integer对象来改。参考代码: public static void swap(Integer a,Integer b) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
Field declaredField = Integer.class.getDeclaredField("value");
declaredField.setAccessible(true);
/**
* 错误写法
* int bVal=b.intValue();
* System.out.println("bVal:"+bTemp); // 2
* System.out.println("bVal->Integer->int:"+Integer.valueOf(bTemp).intValue()); // 1
* declaredField.set(a, bTemp); // bTemp装箱,取到缓存池中值为1的Integer(2)对象。a:1
*/
Integer bTemp=new Integer(b.intValue());
declaredField.set(b, a.intValue());
System.out.println("bVal:"+bTemp);
System.out.println("bVal->Integer->int:"+Integer.valueOf(bTemp).intValue());
declaredField.set(a, bTemp);
}