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

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成员变量(注意修改访问权限)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值