在 Java 中抓取数组的一段,而无需在堆上创建新数组

2022-08-31 06:37:46

我正在寻找Java中一种将返回数组段的方法。例如,获取包含字节数组的第 4 个和第 5 个字节的字节数组。我不想为了做到这一点而在堆内存中创建新的字节数组。现在我有以下代码:

doSomethingWithTwoBytes(byte[] twoByteArray);

void someMethod(byte[] bigArray)
{
      byte[] x = {bigArray[4], bigArray[5]};
      doSomethingWithTwoBytes(x);
}

我想知道是否有一种方法可以做到这一点,例如,4是偏移量,2是长度。doSomething(bigArray.getSubArray(4, 2))


答案 1

免责声明:此答案不符合问题的约束:

我不想为了做到这一点而在堆内存中创建新的字节数组。

(老实说,我觉得我的答案值得删除。@unique72的答案是正确的。伊玛让这个编辑坐了一会儿,然后我会删除这个答案。)


我不知道有没有办法直接使用数组执行此操作而无需额外的堆分配,但是使用子列表包装器的其他答案仅对包装器(而不是数组)进行了额外的分配,这在大型数组的情况下很有用。

也就是说,如果想要简洁,实用程序方法Arrays.copyOfRange()是在Java 6(2006年底?)中引入的:

byte [] a = new byte [] {0, 1, 2, 3, 4, 5, 6, 7};

// get a[4], a[5]

byte [] subArray = Arrays.copyOfRange(a, 4, 6);

答案 2

Arrays.asList(myArray)委托给 new ,它不复制数组,而只存储引用。在那之后使用,它只引用原始列表(它仍然只引用数组)。无需复制数组或其内容,只需创建包装器,并且所涉及的所有列表都由原始数组支持。(我以为它会更重。ArrayList(myArray)List.subList(start, end)SubList