1.剖析一道不简单的问题-Integer类型在swap内部的交换问题

版权声明:版权归零零天所有 https://blog.csdn.net/qq_39188039/article/details/85087936

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){

	}
}

注意点

  1. 引用传递和值传递
  2. 反射
  3. 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);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39188039/article/details/85087936