1

假设我有以下方法签名

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 源代码不能构建在它之上的实现细节?它甚至不能——它没有语义,对吧?

编辑:愚蠢的索引错误

4

3 回答 3

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));
于 2012-06-18T07:59:18.840 回答
1

如果不创建容器的新实例,则无法返回数组(也是集合)中的项目范围/子集。

我不能不猜就回答第二个问题,但是如果JVM 想为一个数组分配 2 个内存区域,它可以在你不知道的情况下做到这一点。

于 2012-06-18T07:56:39.857 回答
0

在 C/C++ 中,这将非常容易通过一些指针算术来完成,但在 Java 中,我不太确定它是否可能。

您可以做的最好的事情是使用copyOfRange方法,尽管这会产生深层复制

于 2012-06-18T08:00:01.667 回答