`
liugang594
  • 浏览: 985916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中swap()方法的实现

阅读更多

为了能更多的掌握C/C++,时不时的就会拿起一本什么书看看。

 

昨天又看到了请指针和引用的部分,又会有经典的swap()方法的实现。几乎所有人都知道了,要实现一个正确的swap()方法需要以指针或引用为参数,例如:

 

//使用指针
void swap(int* a, int* b){
	
	int tmp = *a;
	*a = *b;
	*b = tmp;
	
}

//使用引用
void swap(int& a,int& b){
	
	int tmp = a;
	a = b;
	b = tmp;
	
}

 

我不太熟悉C/C++,所以要是有什么问题,表怪我。

 

突然就想到,在Java中需要怎么实现这个过程呢?Java中没有所谓的指针和引用的概念,并且Java中所有的传递都是值传递,也就是说,下面的方法在Java中同样没有效:

 

	void swap(int a, int b){
		int tmp = a;
		a = b;
		b = tmp;
	}

 

所以这是相当尴尬的事。为了实现一个正确的交换过程,好像必须做一些更复杂的事。

 

如果a,b是类中两个成员变量,那可以直接写如下方法:

 

	int a = 4;
	int b = 5;
	
	public void swap(){
		int tmp = a;
		a = b;
		b = tmp;
	}

 

因为Java中所有的方法、变量必须在一个类中声明,所以此时a,b和swap()在同一个类中,因此不需要传递参数,在swap()方法中就直接引用对象的成员变量。

 

另一个方法就是通过重新赋值的方式进行,例如可以写一个变量方法:

 

	public static int[] swap(int a1, int a2){
		int tmp = a1;
		a1 = a2;
		a2 = tmp;
		return new int[]{a1,a2};
	}

 

根据传递进来时的顺序,最后再重新取回对应的值,例如:

 

		int a = 4;
		int b = 5;
		
		int[] swap = swap(a, b);
		a = swap[0];
		b = swap[1];
		System.out.println(a+"  "+b);
 

看来没有指针或引用,也是有很大问题,按理,以下方法应该适用于所有的交换:

 

	public static <T> void swap(T t1, T t2){
		T tmp = t1;
		t1 = t2;
		t2 = tmp;
	}
 

不过,测试过后就会发现,这个方法总是失效的。所以我们总是必须想到其他的方式来实现。

分享到:
评论
1 楼 tldxk 2015-06-05  
重新赋值的方式直接return就好,即使实际上交换了也只是局部变量~
public static int[] swap (int a1, int a2) {
	return new int[] {a2, a1};
}

相关推荐

    Java hotswap demo

    Java HotSwap是Java Development Kit (JDK)中的一个特性,通常与Java Debug Interface (JDI)一起使用。 IBM DeveloperWorks上的一篇文章《Java hotswap:类的动态更新》...

    java 和 c# 不同的7个方法 实现 ABCD 全排列

    在Java中,可以使用`ArrayList`配合`Collections.swap()`,C#中可使用`List&lt;T&gt;`配合`Swap()`方法。 4. **位运算**: 利用位运算,我们可以创建一个二进制数,每一位代表一个字符是否被选中。通过遍历所有可能的二...

    java中各种排序方法的实现源码

    由于篇幅限制,这里不再展示这两种排序的源码,但您可以在`javasort`压缩包文件中找到它们的实现。 以上就是Java中常见排序算法的概述和部分源码实现。实际应用中,根据数据特性、内存限制和性能要求,可以选择合适...

    C/C++和Java达到swap不同功能

    以上就是C/C++和Java中实现`swap`功能的不同方法。在C/C++中,我们可以直接操作内存地址,而在Java中,我们必须借助其他机制来模拟这一过程,以确保数据安全性和避免指针相关的问题。这些差异体现了两种语言在设计...

    批处理作业调度回溯法java实现

    在这个Java实现中,主算法是 flowshop 方法,该方法使用回溯法来搜索所有可能的作业调度方式,以找到最佳的作业调度方式。我们首先初始化当前时间和最佳时间,然后对每个作业进行递归搜索,以找到最佳的作业调度方式...

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

    Hotswap,全称为Dynamic Class File Manipulation (DCM),它扩展了Java虚拟机(JVM)的动态加载机制,不仅限于修改类的方法体,还能添加、删除类的属性和方法,甚至改变类的继承关系。这对于开发过程中频繁的代码...

    s-des算法的Java实现和C++实现

    在提供的文件中,`sdes.cpp`可能是C++实现的源代码,而`SDES.java`则是Java实现的源代码。通过阅读和理解这些代码,你可以更深入地了解S-DES算法的具体实现细节,并且可以将其作为学习和研究的参考。

    java 快速排序 折半查找的界面实现 (递归与分治法)

    在Java编程中,这两种算法都可以通过递归和分治策略进行实现,以提高效率和可读性。下面我们将深入探讨这两个算法的原理、实现方式以及它们在Java中的应用。 首先,快速排序是一种高效的排序算法,由C.A.R. Hoare在...

    用数组实现的优先队列(JAVA)

    在Java中,我们可以使用`java.util.PriorityQueue`类来实现优先队列,但这里我们关注的是用数组实现的方法。 2. **数组实现的基本思想** 数组实现优先队列的核心思想是维护一个最小堆(最小堆是堆数据结构的一种,...

    Java并发机制的底层实现原理.pdf

    Java中的CAS(Compare-And-Swap)操作也是通过这种硬件级别的原子指令实现的,它可以在没有锁的情况下实现对共享变量的操作。 综上所述,Java并发机制的底层实现原理包括了对本地内存和线程安全的处理、volatile和...

    java 多态的泛型实现

    方法重写则是在子类中重新定义父类已有的非私有方法,以提供不同的实现。 泛型,又称为参数化类型,允许我们在定义类、接口或方法时使用类型参数,而不是具体的类型。这样做的好处在于可以创建通用的容器类,如...

    基于Java的Hotswap插件.zip

    # 基于Java的Hotswap插件 [![Version](https://img.shields.io/jetbrains/plugin/v/PLUGIN_ID.svg)](https://plugins.jetbrains.com/plugin/PLUGIN_ID) [![Downloads]...

    Java并发——无锁实现

    在Java并发编程中,无锁实现是一个高级技术,它可以让多个线程在没有使用传统锁机制(如synchronized关键字或显示锁Lock)的情况下,安全地执行对共享资源的操作。无锁机制主要依赖于硬件的原子指令,尤其是比较并...

    java顺序表实现约瑟夫环的两种方法

    本篇将详细介绍两种通过Java顺序表实现约瑟夫环的方法。 **方法一:通过数组移动** 在这种方法中,我们首先创建一个数组来模拟环状结构,数组的索引代表每个人的编号。每次执行“杀掉”操作时,我们将数组中指定...

    彻底理解Java中的各种锁.pdf

    在Java中,乐观锁通常是通过CAS(Compare-And-Swap)实现,例如Java中的AtomicInteger类就使用了这种方式。悲观锁则假设最坏的情况,即每次读取数据都认为会被其他线程修改,所以总是对数据进行加锁。synchronized...

    用Java实现几种常见的排序算法

    根据给定的信息,本文将详细介绍如何使用Java语言来实现几种常见的排序算法,包括插入排序(Insertion Sort)、冒泡排序(Bubble Sort)、选择排序(Selection Sort)以及希尔排序(Shell Sort)。这些排序算法在...

    JAVA实现冒泡排序(交换排序)

    在Java中实现冒泡排序,我们可以创建一个名为`bubbleSort`的方法,接受一个整型数组作为参数。首先,我们需要两个嵌套的for循环。外层循环控制遍历整个数组的次数,内层循环用于每次遍历过程中的一次冒泡过程。在内...

    Java泛型的理解与等价实现

    3. **泛型方法**:方法也可以具有类型参数,例如`public static &lt;T&gt; void swap(List&lt;T&gt; list, int i, int j)`。 4. **通配符**:`?`用于表示未知类型,例如`List&lt;?&gt;`表示可以接受任何类型的列表,但不能向其中添加...

    JAVA CAS实现原理与使用.docx

    Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...

    JAVA CAS深度分析

    JAVA CAS(Compare And Swap)是一种原子操作,用于在多线程环境中实现同步机制。CAS 通过将内存值 V、旧的预期值 A 和要修改的新值 B 进行比较,如果预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都...

Global site tag (gtag.js) - Google Analytics