在Java中模拟通过引用传递数组引用(即对引用的引用)

时间:2010-03-19 03:13:54

标签: java arrays pass-by-reference

我想知道,在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;
}

是的,我知道我可以交换这些值,直到我到达中间位置,它会更有效率,但是对于其他更复杂的目的,无论如何我是否可以操纵实际指针?

再次,谢谢。

5 个答案:

答案 0 :(得分:2)

  

无论如何我可以操纵实际指针吗?

Java不通过引用传递,因此您无法直接操作原始指针。正如您所知,Java通过价值传递一切。 您无法传递对数组对象的引用,并期望某个方法可以修改原始引用以指向另一个数组对象

你当然可以:

  • 修改引用数组对象的元素(ala 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元素数组。然后你要传递一个持有数组的对象或一个数组,其中唯一的元素包含你想要操作的数组。