假设我有以下方法签名
int f (int[] values)
我称之为:
int[] myValues = {1,2,3,4,5}
f (myvalues)
然后,由于数组是对象,对象是引用类型,f接收到int的引用,并且可以更改它们的值,以便调用者可以看到更改。
现在我怎么能以这样的方式调用f
:它接收对数组元素2,3,4的引用(即从索引1到3的子范围),而不复制{{1} }吗
像
myValues
当然不会编译(并且会保持数组所具有的大小)但是可能会传输我正在寻找的想法?
在其他语言中,我可以使用指针算术来计算f ((int[]) myvalues[1])
的地址,并将其视为整数数组的开头,并传递显式计数参数。 (当然,这种类型不安全。)
我可以在Java中执行此操作而不将三个元素的值复制到中间数组吗?
子问题:数组元素是值类型,是否完全存储在连续的地址中,或者是由引用整数的元素组成的数组?难道这个问题没有意义,因为即使后者的答案是“是”,我也无法继续构建,因为那将是Java源不能构建的实现细节吗?它甚至不能 - 它没有语义,对吧?
编辑:愚蠢索引错误
答案 0 :(得分:2)
您可以使用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));
答案 1 :(得分:1)
如果不创建容器的新实例,则无法返回数组(也称为Collection)中的项目范围/子集。
我不能不猜测,但 IF JVM想为一个阵列分配2个内存区域,它可以在你不知道的情况下完成。
答案 2 :(得分:0)
在C / C ++中,使用一些指针算法会非常容易,但在Java中,我不太确定它是否可行。
您可以做的最好的事情是使用copyOfRange方法,但这会产生深层复制。