簡體   English   中英

參考(不復制)一維數組的子范圍?

[英]Reference (not copy) a subrange of a one-dimensional array?

假設我有以下方法簽名

int f (int[] values)

我稱之為:

int[] myValues = {1,2,3,4,5}
f (myvalues)

然后,由於數組是對象,對象是引用類型,f接收對int的引用 ,並且可以更改它們的值,以便調用者可以看到更改。

現在,我怎么能以一種方式調用f ,它接收對數組元素2,3,4的引用(即從索引1到3的子范圍),而不復制myValues 就像是

f ((int[]) myvalues[1])

這當然不會編譯(並且會保持數組所具有的大小)但可能會傳輸我正在尋找的想法?

在其他語言中,我可以使用指針算術來計算myValues[2]的地址,並將其視為整數數組的開頭,並傳遞顯式計數參數。 (當然,這種類型不安全。)

我可以在Java中執行此操作而無需將三個元素的值復制到中間數組嗎?

子問題:數組元素是值類型,是否存儲在連續的地址中,或者是由引用整數的元素組成的數組? 難道這個問題沒有意義,因為即使后者的答案是“是”,我也無法繼續構建,因為那將是Java源不能構建的實現細節嗎? 它甚至不能 - 它沒有語義,對吧?

編輯:愚蠢的索引錯誤

您可以使用List而不是數組。

int[] myValues = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> myValuesList = Arrays.asList(myValues);

// change the argument of function to List
doSomething(List<Integer> input);

// and then just give the function a range of the myValues.
// This List is still backed by your array myValues, it just
// a view of the original array.
doSomething(myValuesList.subList(2,3));

如果不創建容器的新實例,則無法返回數組(也是Collection)中的項目范圍/子集。

我不能不猜測,但是如果 JVM想為一個陣列分配2個內存區域,它可以在你不知道的情況下完成。

在C / C ++中,使用一些指針算法非常容易,但在Java中,我不太確定它是否可行。

您可以做的最好的事情是使用copyOfRange方法,盡管這會產生深層復制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM