如何在Java中获取数组的子数组,而不复制数据?

我有一些类的库,使用我的数据,正在被读入缓冲区。 是否有可能以某种方式避免一次又一次地复制数组,将越来越多的数据传递给处理方法? 好吧,这听起来很奇怪,但在我个人的情况下,还有一个特殊的作者,它将数据分成块并将它们分别写入不同的位置,所以它只是执行System.arraycopy,获取需要的内容并调用底层的作者,子arrays。 这发生了很多次。 什么是重构这种代码的最佳方法?

Java中的许多类接受数组的一个子集作为参数。 例如Writer.write(char cbuf [],int off,int len)。 也许这已经足够你的用例。

Arrays.asList(array).subList(x, y). 

这个方法不会给你一个数组,而是一个更灵活的List

这里是使用java.nio.ByteBuffer进行封装的例子。 这应该是非常接近你所需要的。 至less对于一些操作。

 byte [] a2 = {0, 0, 1, 0}; ByteBuffer buf = ByteBuffer.wrap(a1,0,3); 

只是一个警告, buf.array()返回所有元素的原始数组(后端)。

如果使用像byte []这样的内置数组,则无法在Java中声明子数组。 原因是:数组的长度是与数据一起存储的,而不是对它的引用的声明。 因此,不复制数据的子数组没有地方可以存储的长度! 所以对于基本的types,你可以使用上面提到的有效的字节数组副本,对于更高的types(List),可以使用方法。

您可以采用与String类相同的方法; 为由数组构造的不可变对象创build一个类,一个起始偏移量和一个可以访问子数组的结束偏移量。 这样的对象的用户不必知道整个数组或子数组之间的区别。 构造函数不需要复制数组,只需存储数组引用及其边界。

你可以使用(ArrayList).subList(value1,value2)我相信,也许这可以帮助你的情况? 那是因为如果你想使用一个ArrayList。

看看Arrays.copyOfRange(***)方法。