[英]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.