package cn.chen.demo.fielddemo;
import java.lang.reflect.Field;
/**
* 两个Integer的引用对象传给一个swap方法
* 在方法内部进行交换,返回后,两个引用变量是否发生变化?
* @author chenlf
* 知识点:
* 1.自动装箱和拆箱
* 2.Integer -128~127之间的缓存
* 3.反射:通过反射去修改 private final不可变变量
*/
public class SwapTest {
public static void main(String[] args) {
Integer a=1,b=2;//相当于 Integer a = Integer.valueOf(1);自动封装
//调用到ValueOf()方法-->IntegerCache.cache()源码查看
//-128到127已经缓存了,意味着这期间的值拿到的是同一个,即内存地址是同一个
//private final int value; 存在这里(Integer类中)
//所以我们如果要改变的话,就得去改它的内存地址
//这个值(final修饰)是私有不可变的变量,只能通过反射去改变
System.out.println("改变前值:a="+a+",b="+b);
try {
swap(a,b);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("改变后值:a="+a+",b="+b);
}
//传递的是引用类型,则是接受的是原始值的地址,而不是值本身
//传递的是基本类型,则是接受的是原始值的副本,原始值不变
public static void swap1(Integer a, Integer b) throws Exception {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);//设置可以访问成员的私有不可变的变量
int tmp = a.intValue();//1
field.set(a, b.intValue());//a = Integer.valueOf(b).intValue() = 2
//tmp修改的是内存地址,所以这里tmp的值变成2
field.set(b, tmp);
//会变成同一个值,a=2,b=2
}
//解决使用同一块内存,那么就是new一个
public static void swap(Integer a, Integer b) throws Exception {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);//设置可以访问成员的私有不可变的变量
Integer tmp =new Integer(a.intValue());
field.set(a, b.intValue());
field.set(b, tmp);
}
}
两个Integer如何交换值?
最新推荐文章于 2023-08-12 10:43:20 发布