值传递和引用传递

本文深入探讨了在Java中使用Integer对象进行值交换的过程及原理。揭示了直接调用方法无法实现真正交换的原因,并提供了通过反射机制实现Integer值交换的具体方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析一道不太简单的题:

使用 Integer 进行元素的交换的时候,两个本身的值并没有真正的交换

package com.zwz.test;

/**
 * 两个 Integer 的引用对象传递给一个 swap 的方法内部进行交换,
 * 返回后,两个引用值是否会发生变化
 */
public class TestInteger
{

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


    public static void swap(  Integer i1,Integer i2 ){
        Integer temp = i1;
        i1 = i2;
        i2 = temp;
    }


}

结果是交换后数据并没有发生变化

原因在于传值的时候是进行的值的传递,并没有把引用传递进来,所以交换后原始引用值并没有发生变化。

把方法进行下面的修改:

   public static void swap2( Integer i1,Integer i2 ) throws Exception {

        Field field = Integer.class.getDeclaredField("value");
        field.setAccessible( true );
        int tmp = i1.intValue();
        field.set(  i1,i2.intValue()  );
        field.set(  i2,tmp );

    }

使用上面的这个  swap2 返回的结果是 

a=2   b=2  因为 Integer.intValue()  这个函数获取的是 Cache 缓存当中的数据

先把 i1的值给 tmp   tmp值变为 1 

然后 i2的值给 i1 , 这时候 tmp也用的是 i1的缓存 ,所以值都变成2

最后再把 tmp的值给i2 ,  i2 也变成  2

 

如果想让 i1 与 i2 真正的交换值,需要这样写:

public static void swap2( Integer i1,Integer i2 ) throws Exception {

        Field field = Integer.class.getDeclaredField("value");
        field.setAccessible( true );
        Integer tmp = new Integer( i1.intValue() );
        field.set(  i1,i2.intValue()  );
        field.set(  i2,tmp );

    }

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值