选择子阵列而不复制到新缓冲区?

时间:2013-12-09 18:53:07

标签: java arrays

我有float[] array长度为100.有没有办法可以选择(伪代码):

x = array[10:19];

要获取元素10,11,12,...,19而不复制到另一个缓冲区?我在移动应用程序中,我不想浪费空间或时间这样做。我宁愿只引用系统用于array的指针。 谢谢

4 个答案:

答案 0 :(得分:2)

最有效的方法是使用System.arrayCopy(),这比使用循环手动复制要快得多,效率更高。它将需要另一个数组,但是你使用的任何方法(除了通过表示要使用的偏移量的几个整数传递原始数组之外)都会这样做,并且它相对便宜 - 内存消耗位通常是它引用的对象而不是数组本身,并且它们不会被复制。

答案 1 :(得分:2)

不,没有API可以做到这一点。对此最接近的解决方案是构建包含现有数组的自己的类,并进行重新索引:

class SubArray {
    private final float[] data;
    private final int offset;
    private final int length;
    public SubArray(float[] data, int offset, int length) {
        this.data = data;
        this.offset = offset;
        this.length = length;
    }
    public float get(int index) {
        if (index >= length) throw ...
        return data[index + offset];
    }
    public void set(int index, float value) {
        if (index >= length) throw ...
        data[index + offset] = value;
    }
}

如果您需要的结果是一个在所有方面都像数组一样的新对象,包括索引运算符,则需要复制。

答案 2 :(得分:2)

更新)前提条件:您应该将数据存储在Float[]而不是float[]中,性能匹配应该是最小的。

您可以使用:Arrays.asList(array).subList(10, 20)

Arrays.asList(array)执行以下操作:

  

返回由指定数组支持的固定大小的列表。 (对返回列表的更改“直写”到数组。)此方法与Collection.toArray()结合,充当基于数组的API和基于集合的API之间的桥梁。返回的列表是可序列化的并实现RandomAccess。

Source

然后.subList(10, 20)会返回List

然后,如果你真的想最终使用数组,你可以采取以下几行:

List<Float> subList = Arrays.asList((Float[])array).subList(10, 20);
Float[] subArray = subList.toArray(new Float[subList.size()]);

更新)将Arrays.asList(array)更改为Arrays.asList((Float[])array),使其现在正确无误。

来自文档:

  

以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果列表适合指定的数组,则返回其中。否则,将为新数组分配指定数组的运行时类型和此列表的大小。

     

如果列表适合指定的数组,并且有空余空间(即,数组的元素多于列表),则紧跟在列表末尾的数组中的元素将设置为null。 (仅当调用者知道列表不包含任何null元素时,这在确定列表长度时很有用。)

     

与toArray()方法类似,此方法充当基于数组的API和基于集合的API之间的桥梁。此外,此方法允许精确控制输出数组的运行时类型,并且在某些情况下可用于节省分配成本。

     

假设x是已知仅包含字符串的列表。以下代码可用于将列表转储到新分配的String数组中:

Source

这应确保不会浪费任何数据,唯一需要注意的是自动装箱。

更新:更改了我的答案,使其在前提下正确无误。

答案 3 :(得分:0)

使用简单的for循环有什么问题?对象在java中通过引用调用。 因此,执行复制数组不会复制对象。

float[] subarray = new float[10];
for(int i = 10, j = 0; i < 19; i++, j++) {
     subarray[j] = x[i];
}

array[0]x[0]对象的引用。

编辑:这仅适用于对象,我不知道它是否也适用于float