【Java】Swap实现

扫盲:Java中只有值传递

我们都知道,在C/C++中,进行值交换的方法:

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

Java参数的值传递

调用方法时,需要提供实参,实参必须与形参的次序相同,称为参数顺序匹配。实参必须与方法签名中的形参在次序上和数量上匹配,在类型上兼容,兼容的意思是不需要显性声明类型转换,即类型相同或者类型转换为拓宽类型。

在调用带参数的方法时,实参的赋给形参,称为值传递。Java 中只有值传递,无论形参在方法中如何改变,实参不受影响。

  • 当参数类型是基本数据类型时,传递的是实参的值,因此不能对实参进行修改。

  • 当参数类型是对象时,传递的是对象的引用,此时可以对实参引用的对象进行修改,但是不能让实参引用新的对象。

简单来说,Java对普通类型的变量是不支持引用传递的

下面讲解两种swap方法

1.通过传数组的方法实现交换

public static void main(String[] args){
	int[] a = new int[2];
	a[0] = 2;
	a[1] = 5;
	System.out.println(a[0] + " " + a[1]);
	swap(a, 0, 1);
	System.out.println(a[0] + " " + a[1]);
}
static void swap(int[] a, int i, int j){
	int t = a[i];
	a[i] = a[j];
	a[j] = t;
}

大部分排序算法就是这样实现

2、通过自定义一个包装类,在属性中进行交换

class MyInt{
	private int val;
	
	public MyInt(int val){
		this.val = val;
	}
	
	public void setVal(int val){
		this.val = val;
	}
	
	public int getVal(int val){
		return this.val;
	}
}

public static void main(String[] args){
	MyInt i1 = new MyInt(2);
	MyInt i2= new MyInt(5);
	System.out.println(i1.getVal() + " " + i2.getVal());
	swap(i1, i2);
	System.out.println(i1.getVal() + " " + i2.getVal());
}
static void swap(MyInt i1, MyInt i2){
	int t = i1.getVal();
	i1.setVal(i2.getVal());
	i2.setVal(t);
}

Java中我们可以通过使用int的包装类——Integer,然后将其作为值的引用传到函数中
但这个Integer包装类也不允许你改变它的数据域;所以我们可以用自己的包装类来实现Swap

若有误,欢迎评论区指正噢~

posted @ 2022-01-11 11:19  .Blank  阅读(416)  评论(0编辑  收藏  举报