2010-03-19 60 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中。

如果我們只需要改變存儲在數組中的值,那麼我們可以這樣做,因爲對象引用是按值傳遞的。