繁体   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