为了加快我的图像处理应用程序,我正在尝试从中间开始处理数组中的值,并使用从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或其他任何经验,所以如果归结为使用它,请提供工作示例。
答案 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实例中来实现这一点。