Q:两个Integer的引用对象传给一个swap方法在内部进行交换,发回后,两个引用的值是否会发生变化?
public class App{
public static void main(String[] args){
Integer a = 1,b = 2;
System.out.println("before:a="+a+",b="+b);
swap(a,b);
System.out.println("before:a="+a+",b="+b);
}
public static void swap(Integer i1,Integer i2){
}
}
注意点
- 引用传递和值传递
- 反射
- Integer本身的理解
解析:
java传递的都是值传递,如果是基本类型,swap接受的是原始值得副本,在内部交换后,影响的是副本,而原始数据不会有影响;如果传递的是引用类型的话,swap接受的是原始值的内存地址,在内部交换后改变的是原始值
查看Integer源码,得值,Integer 在-128-127
的数会有一个缓存
例如:
Integer a = 1,b = 1;
boolean c = a==b;//true
a==b为true,a和b的值复合缓存的条件,其实a和b的内存地址都是一样的所以为true
如果a=128,b=128,则a == b为false
在Integer内部有这么一个属性
private final int value;
只能用反射来改变
public class App{
public static void main(String[] args){
Integer a = 1,b = 2;
System.out.println("before:a="+a+",b="+b);
swap(a,b);
System.out.println("before:a="+a+",b="+b);
}
public static void swap(Integer i1,Integer i2){
Field field = Integer.class.getDeclaredField("name");
field.setAccessible(true);
Integer tmp = i1;
filed.set(i1,i2.intValue());
filed.set(i2,tmp);
}
}
运行结果,发现还是没有改变,原因是:在-128-127内的数缓存了
可以采用new的方式避免缓存
最终代码如下:
public class App{
public static void main(String[] args){
Integer a = 1,b = 2;
System.out.println("before:a="+a+",b="+b);
swap(a,b);
System.out.println("before:a="+a+",b="+b);
}
public static void swap(Integer i1,Integer i2){
Field field = Integer.class.getDeclaredField("name");
field.setAccessible(true);
Integer tmp = new Integer(i1.intValue);
filed.set(i1,i2.intValue());
filed.set(i2,tmp);
}
}