值传递和引用传递

╰半橙微兮° 2022-05-17 03:47 383阅读 0赞

分析一道不太简单的题:

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

  1. package com.zwz.test;
  2. /**
  3. * 两个 Integer 的引用对象传递给一个 swap 的方法内部进行交换,
  4. * 返回后,两个引用值是否会发生变化
  5. */
  6. public class TestInteger
  7. {
  8. public static void main(String[] args) {
  9. Integer a=1,b=2;
  10. System.out.println( "a="+a+" b="+b );
  11. swap( a,b );
  12. System.out.println( "a="+a+" b="+b );
  13. }
  14. public static void swap( Integer i1,Integer i2 ){
  15. Integer temp = i1;
  16. i1 = i2;
  17. i2 = temp;
  18. }
  19. }

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

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

把方法进行下面的修改:

  1. public static void swap2( Integer i1,Integer i2 ) throws Exception {
  2. Field field = Integer.class.getDeclaredField("value");
  3. field.setAccessible( true );
  4. int tmp = i1.intValue();
  5. field.set( i1,i2.intValue() );
  6. field.set( i2,tmp );
  7. }

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

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

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

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

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

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

  1. public static void swap2( Integer i1,Integer i2 ) throws Exception {
  2. Field field = Integer.class.getDeclaredField("value");
  3. field.setAccessible( true );
  4. Integer tmp = new Integer( i1.intValue() );
  5. field.set( i1,i2.intValue() );
  6. field.set( i2,tmp );
  7. }

发表评论

表情:
评论列表 (有 0 条评论,383人围观)

还没有评论,来说两句吧...

相关阅读

    相关 传递引用传递

    值传递传递的是值得地址,引用传递传递的是句柄的地址。 解释:值传递就是:比如new一个Object类型的对象,把引用给一个变量x,这个值(对象)和变量都会占内存(引用在栈中,

    相关 传递,地址传递引用传递

    什么是值传递,地址传递和引用传递?它们有什么不同?这在学校考试,找工作面试中都是常见的问题。它们之间的区别容易搞错,长时间不用也容易忘记。最近又被问到这个问题,想想还是整理一下

    相关 Java传递引用传递

    概念 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,

    相关 传递引用传递

    下面有一个代码非常好帮助理解 我的理解是: 引用在栈中,存储变量堆地址。实际变量在堆中。引用指向变量。 方法参数传递的是堆中地址的值(其实也是栈中变量存储的值),是