如果您曾经使用过C或C++并且了解指针的工作原理,那么让我深有感触的是以下陈述:
In Java, everything is passed by value.
In case of Objects, the reference (pointer) is passed by value.
所以基本上,这是关于swap函数的。
public void swap(int[] a, int[] b)
{
etc.
}
我将只获取指向a
int[]数组和指向b
int[]数组的指针。
您只是交换了两个指针。您不能像那样修改指针的内容。
基本上,这相当于C语言的操作。
void swap(int* a, int* b)
{
int* temp = a;
a = b;
b = temp;
}
int main(void)
{
int a[] = {5,6,7,8};
int b[] = {1,2,3,4};
swap(a,b);
}
即使在C语言中,这也只能像这样工作:
void swap(int** a, int** b)
{
int* temp = (*a);
(*a) = (*b);
(*b) = temp;
}
int main(void)
{
int a[] = {5,6,7,8};
int b[] = {1,2,3,4};
swap(&a, &b);
}
当然,在Java中你无法发送引用的引用。在这个意义上,指针在Java中不存在。
因此,为了实际修改另一个函数中的对象,你需要一个“Holder”对象来复制引用,但其中对你想要修改的对象的引用实际上是该对象的真实引用,如果这有意义。
因此,下面的内容可以起作用:
public class ArrayHolder
{
public int[] array;
public ArrayHolder(int[] array)
{
this.array = array;
}
}
public void swap(ArrayHolder a, ArrayHolder b)
{
int[] temp = a.array;
a.array = b.array;
b.array = temp;
}
public static void main(String[] args)
{
ArrayHolder aaa = new ArrayHolder(new int[] {5,6,7,8});
ArrayHolder bbb = new ArrayHolder(new int[] {1,2,3,4});
swap(aaa,bbb);
}