代码之家  ›  专栏  ›  技术社区  ›  Leif Andersen

爪哇中数组引用(即对引用的引用)的模拟引用

  •  3
  • Leif Andersen  · 技术社区  · 14 年前

    我想知道,在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 回复  |  直到 10 年前
        1
  •  2
  •   polygenelubricants    14 年前

    有没有什么我可以操作实际的指针?

    Java不通过引用,所以不能直接操作原始指针。正如你已经发现的,Java通过值传递所有的东西。 不能将引用传递给数组对象,并且期望方法将原始引用修改为指向 另一个 数组对象 .

    当然,你可以:

    • 修改引用数组对象(ala)的元素 java.util.Arrays.sort )
    • 将引用传递给具有可设置字段的对象(例如 Throwable 有一个 setStackTrace )
    • return 取而代之的是新引用(ala java.util.Arrays.copyOf )
        2
  •  1
  •   Tom Hawtin - tackline    14 年前

    好吧,您可以显式地传递包含引用的对象。 java.util.concurrent.atomic.AtomicReference 是现成的,尽管它确实带有不稳定的语义,你可能不想要。有些人使用单元素数组从匿名内部类返回值(尽管在我看来这不是个好主意)。

        3
  •  1
  •   Jim Ferrans    14 年前

    此方法在适当的位置反转数组的元素。打电话的人看到了变化。(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;
           }
       }
    
        4
  •  0
  •   Thiyaneshwaran S    14 年前

    在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中是不可能的任何直接手段。

    如果我们只需要更改存储在数组中的值,那么我们可以这样做,因为对象引用是按值传递的。

        5
  •  -1
  •   Gabe Timothy Khouri    10 年前

    要将引用传递给数组引用。在这种情况下,您只需创建一个类来保存引用并将引用传递给该类,或者只传递一个被传递类型的1元素数组。然后传递一个包含数组的对象,或者传递一个数组,该数组的唯一元素包含要操作的数组。