我想知道,在java中,有可能以任何方式模拟数组的引用传递吗?是的,我知道语言不支持它,但无论如何我能做到。比方说,我想创建一个方法来反转数组中所有元素的顺序。 (我知道这个代码片段不是最好的例子,因为有更好的算法可以做到这一点,但这是我想为更复杂的问题做的事情类型的一个很好的例子。)
目前,我需要创建一个这样的类:
public static void reverse(Object[] arr) {
Object[] tmpArr = new Object[arr.length];
count = arr.length - 1;
for(Object i : arr)
tmpArr[count--] = i;
// I would like to do arr = tmpArr, but that will only make the shallow
// reference tmpArr, I would like to actually change the pointer they passed in
// Not just the values in the array, so I have to do this:
for(Object i : tmpArr)
arr[count++] = i;
return;
}
是的,我知道我可以交换这些值,直到我到达中间位置,它会更有效率,但是对于其他更复杂的目的,无论如何我是否可以操纵实际指针?
再次,谢谢。
答案 0 :(得分:2)
无论如何我可以操纵实际指针吗?
Java不通过引用传递,因此您无法直接操作原始指针。正如您所知,Java通过价值传递一切。 您无法传递对数组对象的引用,并期望某个方法可以修改原始引用以指向另一个数组对象。
你当然可以:
java.util.Arrays.sort
)Throwable
具有setStackTrace
)return
新参考(ala java.util.Arrays.copyOf
)答案 1 :(得分:1)
好吧,您可以显式传递包含引用的对象。 java.util.concurrent.atomic.AtomicReference
已经开箱即用,虽然它确实带有您可能不想要的易失性语义。有些人使用单个元素数组从匿名内部类返回值(虽然这对我来说似乎不是一个好主意)。
答案 2 :(得分:1)
此方法将Array的元素反转到位。呼叫者看到了变化。 (在Java中,所有内容都按值传递,包括对象引用。)
public static void reverse(Object[] arr) {
for ( int i = 0, j = arr.length - 1; i < j; i++, j-- ) {
Object temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
答案 3 :(得分:0)
在Java中,对象引用按值传递。
所以,如果你想找到像
这样的东西function referenceCheck()
{
int[] array = new int[]{10, 20, 30};
reassignArray(&array);
//Now array should contain 1,2,3,4,5
}
function reassignArray(int **array)
{
int *array = new int[] { 1, 2, 3, 4, 5};
}
然后,任何直接手段都无法用Java实现。
如果我们只需要更改存储在数组中的值,那么我们可以这样做,因为对象引用是按值传递的。
答案 4 :(得分:-1)
您想要传递对数组引用的引用。在这种情况下,您只需要创建一个类来保存引用并传递对该类的引用,或者只传递一个传递类型的1元素数组。然后你要传递一个持有数组的对象或一个数组,其中唯一的元素包含你想要操作的数组。