public static void main(String [] args){
Integer a=1,b=2;
System.out.println("a = " + a +",b = " + b);
swap1(a,b);
System.out.println("a = " + a +",b = " + b);
}
版本1
public static void swap1(Integer a,Integer b){
Integer temp=b;
b=a;
a=temp;
}

如果传值是基本值,传的是原始值的副本
函数中修改,只是修改了副本,原始值不变
如果传的引用值,则是原始值的地址
怎么做?
Integer源码
/**
* The value of the {@code Integer}.
*
* @serial
*/
private final int value;
修改这个成员变量的值,修改地址
版本2
public static void swap2(Integer a,Integer b) throws Exception{
Field field = Integer.class.getDeclaredField("value"); //通过反射拿到成员变量
field.setAccessible(true); //设置访问权限 访问私有变量
int temp = a.intValue();
field.set(a,b.intValue());
field.set(b,temp);
}

为什么还是没有达到预期的效果??? a和b的值还是没有交换
field.set(a,b.intValue()); //这句话改变了a,也改变了temp
temp和a用的一块内存地址,a改了temp也改了
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
验证缓存的存在
public static void main(String [] args)throws Exception{
Integer a=1,b=1;
System.out.println(a==b);
}
返回true则说明是a,b在同一块地址
版本3
public static void swap3(Integer a,Integer b) throws Exception{
Field field = Integer.class.getDeclaredField("value"); //通过反射拿到成员变量
field.setAccessible(true); //设置访问权限 访问私有变量
Integer temp = new Integer(a.intValue()); //修改 new Integer对象 开辟新空间
field.set(a,b.intValue());
field.set(b,temp);
}
考点:
1,值传递与引用传递
2,自动装箱与拆箱
3,Integer -128 - 127 有cache
4,通过反射修改private final成员变量(注意修改访问权限)