值传递&引用传递 经典题目

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也改了


Integer -128 - 127会有缓存
/**
* 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成员变量(注意修改访问权限)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值