我有float[] array
长度为100.有没有办法可以选择(伪代码):
x = array[10:19];
要获取元素10,11,12,...,19而不复制到另一个缓冲区?我在移动应用程序中,我不想浪费空间或时间这样做。我宁愿只引用系统用于array
的指针。
谢谢
答案 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。
然后.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数组中:
这应确保不会浪费任何数据,唯一需要注意的是自动装箱。
更新:更改了我的答案,使其在前提下正确无误。
答案 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