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文件夹中有三个文件 1、classes文件夹,就是把java文件编译出来的class文件存放位置 2、java文件夹,就是你要热更的java文件存放路径(热更的时候把你要热更的java文件放到里面就好) 3、history文件夹,...
本实验报告涵盖了 Java 编程语言中方法的声明、调用、值传递、重载和 Math 类的使用。通过三个实验,学生掌握了方法的声明和调用、值传递和方法的重载,并熟悉了 Math 类的使用。 一、方法的声明和调用 在 Java 中...
在Java中,当你修改了某个类的非静态方法或者添加新的非final字段时,JVM支持热替换。这是因为这些更改不会影响到已经存在的对象状态。然而,对于添加、删除或修改静态字段、静态初始化器、类结构(如增加父类、接口...
Java中的数学函数 - **Math类**提供了许多数学函数, 如: - `Math.abs()`: 绝对值 - `Math.sqrt()`: 平方根 - `Math.pow()`: 幂 - `Math.round()`: 四舍五入 - `Math.random()`: 随机数 - `Math.max()`, `...
安装完成后,若要在Eclipse中利用Hotswap调试Java程序,首先需要使用包含Hotswap补丁的Java以调试模式启动程序,然后在Eclipse中连接到该进程。这样,Eclipse工程中对class文件的任何改动都将实时反映到运行中的Java...
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集合框架中的List、Set和Map接口的区别及其典型实现如ArrayList、LinkedList...
在Java中,常见的乐观锁实现是无锁编程,如使用原子类(AtomicInteger、AtomicLong等)中的CAS(Compare and Swap)算法。悲观锁则假设在读取数据时会有其他线程修改,所以在读取时即加锁,如`synchronized`关键字和...
CAS(Compare-And-Swap)是 Java 中的一种原子操作,用于比较和交换变量的值。CAS 可以用于解决多种并发编程问题,例如原子变量、锁机制等。 原子引用 原子引用是 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中创建线程可以通过继承Thread类或实现Runnable接口,推荐使用后者。 2. **线程状态**: Java线程有多种状态,包括新建、就绪、运行、阻塞和死亡等状态。 3. **守护线程**: 守护线程是为其他线程服务的...
Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...
- **引用传递的本质**:Java中的引用传递本质上是传递对象的引用,而不是对象本身。这意味着在方法内部对对象所做的任何改变都会影响到原始对象。 - **引用与值的区别**:与基本类型的值传递不同,引用传递不会创建...
Java 中只有按值传递的原因是因为 Java 程序设计语言的设计理念。在 Java 中,方法参数的传递方式是按值传递的,而不是按引用传递的。这意味着,当方法接收到参数时,实际上是接收到参数的副本,而不是原始参数本身...
Java Memcached客户端通常支持CAS(Compare and Swap)操作,这是一种无锁算法,可以保证在多线程环境下的数据一致性。 7. **性能优化**:为了提高性能,Java Memcached客户端可能会采用批量操作,如批量设置、获取...
本教程将深入讲解如何在Java中对List进行循环移动元素的操作,通过源代码实例和详细指导来帮助你掌握这一技能。 首先,我们需要理解Java中的List接口,它继承自Collection接口,常见的实现类有ArrayList和...
我们将详细探讨Java中的值传递和引用传递的概念,以及它们之间的区别。 首先,值传递是Java中最基本的参数传递方式。当一个变量作为参数传递给方法时,实际上是传递了该变量存储值的一个副本。这意味着在方法内部对...
`cache-swap`库则巧妙地利用了本地文件系统,将大对象或频繁访问的数据暂存到硬盘的临时文件中,以此提升数据操作的效率。 ### 二、核心原理 1. **数据存储**:当需要存储数据时,`cache-swap`会将数据序列化为...
比较元素值法是通过比较数组中的每个元素值来获取最大值的方法。例如: ```java public static void Compare01(int[] arr) { int max = arr[0]; for (int x = 1; x ; x++) { if (arr[x] > max) { max = arr[x];...
在本课程"计算机后端-Java-Java高并发从入门到面试教程-课程准备"中,我们将深入探讨Java编程语言在处理高并发场景下的核心概念和技术。Java是企业级应用开发的重要选择,尤其是在大型分布式系统中,其强大的并发...