`

java陷阱---奇怪的swap----java中的值传递

    博客分类:
  • J2SE
阅读更多
java中的
public static <T> void swap(T a ,T b){
//这里a,b是副本,我们对副本操纵是没有意义的
		T t = a;
		a=b;
		b=t;
			}


对这个方法测试表明,交换没有发生。。。。火了我。。。。

为什么呢?

java中只有副本传递。。。。给别人的永远是一个副本

a--->a的值<----a'(其中a',b'分别为a,b在传递参数的时候产生的副本)  
  b--->b的值<----b'  
  进入函数体后副本发生了交换,如下图示:  
  a-->a的值<---b'    
  b-->b的值<---a'

所以a,b根本就没动过。。。。


怎么解决呢。。?
因为只有第一级会是副本。。。所以我们需要传递的东西应该位于2级

比如用数组:
public static <T> void swap(T[] a ){ 
//这里a是副本,但是a[0],a[1]就不是副本,所以我们交换的不是副本
		T t = a[0];
		a[0]=a[1];
		a[1]=t;
}

示意图:

          a'
         |
         ↓
a--->a[]的地址--->a[0]的值
         |
         |
         ↓   
        a[1]的值

所以我们是用的a[]的副本,但是操纵的还是真实的东西,不是副本。。。

所以用对象也是可以的。。。

          Obj'
         |
         ↓
obj----->a1--->a1的值
         
         Obj'
         |
         ↓
obj----->a2--->a2的值


注意:

String a ="aa";
String b ="bb";
String[] m = new String[]{a,b};
swapStr(m);
System.out.println(m[0]);System.out.println(a);
System.out.println(m[1]);System.out.println(b);
这里a,b被传到m中是值传递哈。。。。所以交换后ab的值没改变,但是m[0]和m[1]的值改变了


分享到:
评论

相关推荐

    hotswap-for-java-file.zip

    hotswap文件夹中有三个文件 1、classes文件夹,就是把java文件编译出来的class文件存放位置 2、java文件夹,就是你要热更的java文件存放路径(热更的时候把你要热更的java文件放到里面就好) 3、history文件夹,...

    Java实验-掌握方法的声明和调用 掌握方法的值传递 掌握方法的重载

    本实验报告涵盖了 Java 编程语言中方法的声明、调用、值传递、重载和 Math 类的使用。通过三个实验,学生掌握了方法的声明和调用、值传递和方法的重载,并熟悉了 Math 类的使用。 一、方法的声明和调用 在 Java 中...

    Java hotswap demo

    在Java中,当你修改了某个类的非静态方法或者添加新的非final字段时,JVM支持热替换。这是因为这些更改不会影响到已经存在的对象状态。然而,对于添加、删除或修改静态字段、静态初始化器、类结构(如增加父类、接口...

    2024-2025年Java大-中厂高频面试题

    Java中的数学函数 - **Math类**提供了许多数学函数, 如: - `Math.abs()`: 绝对值 - `Math.sqrt()`: 平方根 - `Math.pow()`: 幂 - `Math.round()`: 四舍五入 - `Math.random()`: 随机数 - `Math.max()`, `...

    修改java类不需要重启jboss的利器--hotswap安装手册

    安装完成后,若要在Eclipse中利用Hotswap调试Java程序,首先需要使用包含Hotswap补丁的Java以调试模式启动程序,然后在Eclipse中连接到该进程。这样,Eclipse工程中对class文件的任何改动都将实时反映到运行中的Java...

    hotswap-agent+DCEVM-full

    hotswap-agent-1.3.1-SNAPSHOT.jar+DCEVM-full-7u79-installer.jar 适用jdk版本1.7.0_79 DCEVM-full-7u79...-XXaltjvm=dcevm -javaagent:E:\develope\hotswap-agent\hotswap-agent-1.3.1-SNAPSHOT.jar 然后享受热加载吧

    java 面试 百度入职老哥整理 全是干货

    - Java中基本类型与引用类型的区别主要在于存储方式和操作对象的不同,基本类型直接存储值,而引用类型存储的是对象的引用地址。 - Java集合框架中的List、Set和Map接口的区别及其典型实现如ArrayList、LinkedList...

    Java 多线程与并发(3-26)-Java 并发 - Java中所有的锁.pdf

    在Java中,常见的乐观锁实现是无锁编程,如使用原子类(AtomicInteger、AtomicLong等)中的CAS(Compare and Swap)算法。悲观锁则假设在读取数据时会有其他线程修改,所以在读取时即加锁,如`synchronized`关键字和...

    Java-JUC-多线程 进阶

    CAS(Compare-And-Swap)是 Java 中的一种原子操作,用于比较和交换变量的值。CAS 可以用于解决多种并发编程问题,例如原子变量、锁机制等。 原子引用 原子引用是 Java 中的一种机制,用于描述原子的变量访问。...

    快速排序JAVA实现 - QuickSort.java

    import java.util.Arrays; public class QuickSort { public static void quickSort(int[] arr) { if (arr == null || arr.length ) { return; } quickSort(arr, 0, arr.length - 1); } public ...

    Java面经-百度banbne-副本.pdf

    Java中创建线程可以通过继承Thread类或实现Runnable接口,推荐使用后者。 2. **线程状态**: Java线程有多种状态,包括新建、就绪、运行、阻塞和死亡等状态。 3. **守护线程**: 守护线程是为其他线程服务的...

    Java参数传递PPT

    Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...

    Java的引用和函数参数传递

    - **引用传递的本质**:Java中的引用传递本质上是传递对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何改变都会影响到原始对象。 - **引用与值的区别**:与基本类型的值传递不同,引用传递不会创建...

    深入了解为什么Java中只有值传递?

    Java 中只有按值传递的原因是因为 Java 程序设计语言的设计理念。在 Java 中,方法参数的传递方式是按值传递的,而不是按引用传递的。这意味着,当方法接收到参数时,实际上是接收到参数的副本,而不是原始参数本身...

    java_memcached-release_2.6.6.rar

    Java Memcached客户端通常支持CAS(Compare and Swap)操作,这是一种无锁算法,可以保证在多线程环境下的数据一致性。 7. **性能优化**:为了提高性能,Java Memcached客户端可能会采用批量操作,如批量设置、获取...

    Java 实例 - List 循环移动元素源代码+详细指导教程.zip

    本教程将深入讲解如何在Java中对List进行循环移动元素的操作,通过源代码实例和详细指导来帮助你掌握这一技能。 首先,我们需要理解Java中的List接口,它继承自Collection接口,常见的实现类有ArrayList和...

    Java中的值传递和引用传递实例介绍

    我们将详细探讨Java中的值传递和引用传递的概念,以及它们之间的区别。 首先,值传递是Java中最基本的参数传递方式。当一个变量作为参数传递给方法时,实际上是传递了该变量存储值的一个副本。这意味着在方法内部对...

    前端开源库-cache-swap

    `cache-swap`库则巧妙地利用了本地文件系统,将大对象或频繁访问的数据暂存到硬盘的临时文件中,以此提升数据操作的效率。 ### 二、核心原理 1. **数据存储**:当需要存储数据时,`cache-swap`会将数据序列化为...

    黑马程序员 - Java基础教学 - 04 - 数组、进制转换、二维数组

    比较元素值法是通过比较数组中的每个元素值来获取最大值的方法。例如: ```java public static void Compare01(int[] arr) { int max = arr[0]; for (int x = 1; x ; x++) { if (arr[x] &gt; max) { max = arr[x];...

    计算机后端-Java-Java高并发从入门到面试教程-课程准备.zip

    在本课程"计算机后端-Java-Java高并发从入门到面试教程-课程准备"中,我们将深入探讨Java编程语言在处理高并发场景下的核心概念和技术。Java是企业级应用开发的重要选择,尤其是在大型分布式系统中,其强大的并发...

Global site tag (gtag.js) - Google Analytics