Java 如何在不复制的情况下从另一个字节[]的特定位置获取字节[]?

Java 如何在不复制的情况下从另一个字节[]的特定位置获取字节[]?,java,Java,在java中,我想知道如何从特定位置获取其他字节[]的字节[],而不复制它 例如: byte[] bytes1 = new byte[100]; for (int i = 0; i < 100; i++) { bytes1[i] = (byte)(i+1); } byte[] byte2; byte[]bytes1=新字节[100]; 对于(int i=0;i

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

例如:

byte[] bytes1 = new byte[100];
for (int i = 0; i < 100; i++) {
    bytes1[i] = (byte)(i+1);
}
byte[] byte2;
byte[]bytes1=新字节[100];
对于(int i=0;i<100;i++){
字节1[i]=(字节)(i+1);
}
字节[]字节2;
如何将
字节2
指向位置10处的
字节1
? 我希望字节2有:
[0]=10,[1]=11,[2]=12

可能吗

我试过用ByteBuffer,但没有成功。

对不起,你不能


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

唯一缺少的就是使用VM内部结构(是的,可以使用诸如to和fro JNI调用的指针算法)使用类似于
Arrays.asList(bytes1).subList(startIndex,endIndex)
(注意
asList()
本身无法处理基元数组,您必须在“网上编写或找到一个类似的基元实现;请注意)-注意,您将以这种方式获得一个
列表
视图,而不是
字节[]
,因为这在Java中基本上是不可能的(请注意,VM黑客除外)

或者,按照你说的做——特别是使用
java.nio.Buffer
ByteBuffer
,因为这是指向内存指针的java对应物;使用以数组为背景的
ByteBuffer
基本上可以直接访问数组,也可以以抽象/修改(例如使用偏移量)的方式访问缓冲区

ByteBuffer bytes1=ByteBuffer.allocate(100);
对于(int i=0;i<100;i++){
字节1.put((字节)(i+1));
}
字节1.位置(偏移);
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();
byte[]bytes1=新字节[100];
对于(int i=0;i<100;i++){
字节1[i]=(字节)(i+1);
}
ByteBuffer bytes1=ByteBuffer.wrap(bytes1);
字节1.位置(偏移);
ByteBuffer byte2=bytes1.slice();

不幸的是,你不能。实际上,您需要的是C/C++指针算法,而Java中没有这样的东西

但是,如果您愿意使用不同的接口,那么您可能会有一些运气。它不是一个简单的
列表
,因为它有一个真正的
字节
数组作为后盾-因此使用
字节
对象不会产生内存开销。您仍然会有一些对象开销,但在实际情况中这是可以接受的

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


但是,请记住,避免复制意味着对切片的更改将反映在原始数组中。这可能是你想要的,但还是要非常小心——特别是如果你不是C/C++背景,在C/C++背景下,这些事情是很常见的。

不幸的是,你不能。可能是一个选项:,int)?@LyubomyrShaydariv该实用程序由
列表支持,请参见我的答案。@StefanoSanfilippo它不由
列表支持----它有内部
字节[]a
,而不是
字节[]a
。Fastutil是为高效的原语集合和映射而设计的。@LyubomyrShaydariv ops,my bad.byte[]bytes=新字节[100];对于(inti=0;i<100;i++){bytes[i]=(byte)(i+1);}ByteBuffer bf1=ByteBuffer.wrap(bytes);bf1.位置(15);ByteBuffer bf2=bf1.slice();字节[]byes2=bf2.array();但是字节2不包含15、16、17。它确实包含1,2,3。。。所以ByteBuffer没有help@user3668129请先阅读答案和API文档,然后再说明“有些东西没有帮助”!如果要使用带偏移量的ByteBuffer(
.slice()
),则必须使用
get()
或其他
ByteBuffer
方法,而不是
.array()
-支持数组仍然是一样的!这正是为什么我在代码中从未使用
array()
,并说“使用由TeBuffer支持的数组,您基本上可以直接访问数组,或者以抽象/修改(例如使用偏移量)的方式访问缓冲区。”在Java中,直接数组访问与抽象(偏移量)访问是互斥的!
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();