如何从没有副本的其他字节[]的特定位置获取byte []?

时间:2014-12-15 20:33:00

标签: java

在java中,我想知道如何从特定位置获取byte[]其他byte[]而不复制它?

示例:

byte[] bytes1 = new byte[100];
for (int i = 0; i < 100; i++) {
    bytes1[i] = (byte)(i+1);
}
byte[] byte2;

如何将byte2指向位置10的byte1? 我希望byte2具有:[0] = 10, [1] = 11, [2] = 12

有可能吗?

我尝试使用ByteBuffer但没有任何成功。

3 个答案:

答案 0 :(得分:4)

唯一不能与VM内部结合的东西(是的,它 可以用例如往返JNI调用进行指针算法)使用类似于Arrays.asList(bytes1).subList(startIndex, endIndex)的方式(请注意asList()本身不能处理原始数组,您必须在原语上编写或查找类似的原语实现; http://fastutil.di.unimi.it/docs/it/unimi/dsi/fastutil/bytes/ByteList.html#subList%28int来到(请注意) - 请注意,您将以List方式获取byte[]视图,而不是java.nio.Buffer,因为在Java中基本上不可能(除了VM黑客,请注意我)。

或者,按照你所说的去做 - 具体使用ByteBufferByteBuffer,因为指向内存的Java对应;对于支持数组的ByteBuffer bytes1 = ByteBuffer.allocate(100); for (int i = 0; i < 100; i++) { bytes1.put((byte)(i+1)); } bytes1.position(offset); ByteBuffer byte2 = bytes1.slice(); ,您基本上可以直接访问数组以抽象/修改(例如使用偏移)的方式访问缓冲区。

byte[] bytes1 = new byte[100];
for (int i = 0; i < 100; i++) {
    bytes1[i] = (byte)(i+1);
}
ByteBuffer bytes1 = ByteBuffer.wrap(bytes1);
bytes1.position(offset);
ByteBuffer byte2 = bytes1.slice();

甚至

{{1}}

答案 1 :(得分:3)

不幸的是,你不能。您要求的主要是C / C ++指针算法,Java中没有这样的东西。

但是,如果您愿意使用其他界面,那么您可能会对Commons Primitives ArrayByteList感到满意。它不是简单的List<Byte>,因为它由真正的byte数组支持 - 因此使用Byte对象不会产生内存开销。你仍然会有一些对象开销,但在实际情况下这是可以接受的。

最重要的是,它通过ArrayByteList.subList()方法支持切片,不生成副本。您可以检查source code,切片实现为原始数组的引用以及开始和结束位置的两个标记。

但是,请记住,避免复制意味着对切片的更改会反映在原始数组中。这可能是你想要的,但仍然要非常小心 - 特别是如果你不是来自C / C ++背景,这些都是常见的做法。

答案 2 :(得分:0)

对不起,你不能。

在java中,每个数组都是一个对象。除了存储元素外,它还存储数组的长度。