在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但没有任何成功。
答案 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黑客,请注意我)。
或者,按照你所说的去做 - 具体使用ByteBuffer
,ByteBuffer
,因为指向内存的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中,每个数组都是一个对象。除了存储元素外,它还存储数组的长度。