2010-03-19 53 views
3

我想知道,在java中,是否可以在任何情况下模拟数组的引用传递?是的,我知道这门语言不支持它,但无论如何我都可以做到。比如说,我想创建一个方法来颠倒数组中所有元素的顺序。 (我知道这段代码并不是最好的例子,因为有更好的算法可以做到这一点,但这是我想为更复杂的问题所做的事情的一个很好的例子)。在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; 
} 

是的,我知道我可以只交换值,直到我到了中间,这将是更有效的,但对于其他更复杂的目的,无论如何,我可以操纵实际的指针?

再次,谢谢。

+1

数组从java.lang.Object继承。 Java中的对象总是通过引用传递。 – Dan

+1

@丹:不! Java中引用to_对象被value_分隔。是的,这意味着完全不同的东西。 – polygenelubricants

+1

这可以很好地解释它:http://stackoverflow.com/questions/40480/is-java-pass-by-reference/40523#40523“Java总是按值传递,难点在于理解Java传递对象作为通过值传递的引用。“ –

回答

2

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

Java不通过引用传递,因此您不能直接操作原始指针。正如你发现的那样,Java按价值传递了一切。 您无法传递对数组对象的引用,并且期望一种方法将原始引用修改为指向的另一个数组对象

可以,当然:

  • 修改称为阵列对象的元素(ALA java.util.Arrays.sort
  • 传递一个参考对象与一个可设置的字段(例如Throwable具有setStackTrace
  • return新参考代替(ala java.util.Arrays.copyOf
+0

只有当您使用单个数组时,才返回新的引用。 – Gabe

+0

您可以返回一个数组数组,或将多个数组封装为一个新类型。 – polygenelubricants

+0

唯一的问题是,程序员不得不将数组放在另一个数组中来调用它,但我想这会适用于其他更合适的情况。 –

1

那么,你可以显式传递一个包含引用的对象。 java.util.concurrent.atomic.AtomicReference已经准备就绪,虽然它确实带有您可能不想要的易失性语义。有些人使用单个元素数组来返回来自匿名内部类的值(尽管这对我来说似乎不是个好主意)。

-1

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

+0

是的,我试过了,我知道java不会创建一个完整的数组。相反,它将一个引用或指针传递给数组。但是,它并没有真正传入当程序员调用方法时使用的引用,而是创建一个新引用。所以,当你说'arr = tmpArr'时,arr确实开始指向tmpArr,但是当它离开这个方法时,arr和程序员传递给arr的任何东西都不一样,这意味着它们会得到旧的,无修改,阵列。 –

1

此方法反转阵列的元素 到位。来电者看到更改。 (在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; 
     } 
    } 
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中。

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