直接访问阵列的一部分

时间:2012-05-14 08:51:44

标签: java arrays

为了加快我的图像处理应用程序,我正在尝试从中间开始处理数组中的值,并使用从0开始的索引。

例如,当我使用两个数组时,我经常遇到这样的情况:

public void work(int[] array1, int[] array2, int offset)
{
    int len = array1.length;
    for (int i = 0; i < len; i++)
        array1[i] += array2[i + offset];
}

所以我想创建一个新的变量array3,它直接映射到array2的中间(不是副本),所以我可以这样做:

public void work(int[] array1, int[] array2, int offset)
{
    int[] array3 = array2[offset]...;
    int len = array1.length;
    for (int i = 0; i < len; i++)
        array1[i] += array3[i];
}

实际上,我想要一个与此c语句等效的Java:

int *array3ptr = array2ptr + offset;

注意:我没有JNI或其他任何经验,所以如果归结为使用它,请提供工作示例。

3 个答案:

答案 0 :(得分:1)

使用纯Java数组和array[index]表示法无法做到这一点。在Java数组中,永远不会重叠

然而,您可以将数组包装在IntBuffer中。如果您使用direct buffer(请参阅allocateDirect),您应该会获得真正的良好表现。

诸如

之类的陈述
int *array3ptr = array2ptr + offset;

将写为

IntBuffer array3 = array2.slice().position(offset);

这些

答案 1 :(得分:0)

在java中,甚至整数数组都是堆上的对象。因此int [] array2实际上是直接引用内存中的整数数组。没有创建对象(即数组)的副本,复制只是对数组的引用。

答案 2 :(得分:0)

我对它们没有多少经验,但我认为你可以通过将数组(和子数组)包装到IntBuffer实例中来实现这一点。