Java:在不执行复制操作的情况下偏移字节[]

Java:在不执行复制操作的情况下偏移字节[],java,arrays,performance,memory-management,bytearray,Java,Arrays,Performance,Memory Management,Bytearray,我想知道是否可以访问带有偏移量的字节[],而不必复制周围的数据? 我已经研究了数组。*、ByteArrayInputStream和System.arraycopy,但它们都需要分配一个新的字节[]进行复制 我想要的是在C++中与此等效的代码: char* buffer = new char[256]; char* buf_offset = buffer + 128; // <- no copy char*buffer=新字符[256]; char*buf_offset=buffer+12

我想知道是否可以访问带有偏移量的
字节[]
,而不必复制周围的数据?
我已经研究了
数组。*
ByteArrayInputStream
System.arraycopy
,但它们都需要分配一个新的
字节[]
进行复制

我想要的是在
C++
中与此等效的代码:

char* buffer = new char[256];
char* buf_offset = buffer + 128; // <- no copy
char*buffer=新字符[256];

char*buf_offset=buffer+128;// 不,没有类似的。您只需要自己跟踪偏移量。您始终可以创建一个类来封装(数据、偏移量)对。

您可以通过
ByteBuffer来代替。它可以是高级的、复制的、切片的,而无需复制


ByteBuffer真的很难看而且违反直觉。然而,它在新的JDK API中被广泛使用,因此人们可能会接受它是一种基本类型。

这很不幸,但我想我不得不接受它。谢谢,您不需要为此创建类
ByteBuffer
确实做到了这一点(除其他外)。@Dunes:“除其他外”是一个问题——如果我想处理一个API,它实际上只是一个数组和一个偏移量,我宁愿只使用它,而不是在所有其他操作中使用
ByteBuffer
。ByteBuffer真的很难看,而且违反直觉。然而,它在新的JDK API中被广泛使用,因此人们可能会接受它是一种基本类型。@不可更改:它远不是基本类型。当然,它是开箱即用的,但这远不是“基本”的描述。在Java中没有直接的等价物,但例如
String
实现了一个非常类似的功能:
substring()
返回一个新的
String
实例,该实例在内部使用完全相同的
char[]
与原件相同。这就是Java惯用的方式。这就是为什么采用
字节
数组的API通常会有两个额外的参数-对于
偏移量
长度
:)@MarkoTopolnik:
子字符串()
可以这样工作,但不必这样做。我相信Sun JRE最近改变了这一点。@MarkoTopolnik,oracle改变了substring()……@MarkoTopolnik你应该检查一下最近的版本,b147是古老的。我想它大约是1.7U6,我需要它来完成这个小任务,它很好;)