Java 支持子序列的字节[]的不可变容器,如String.substring()

Java 支持子序列的字节[]的不可变容器,如String.substring(),java,Java,substring()有效地重用了String对象中的底层char[],我想知道是否有一个用于byte[]数组的不可变容器支持对底层数组的类似高效重用 如果它能够处理诸如高效追加和预结束之类的事情,那么就需要额外的注意。如果它是为Maven打包的,还有额外的积分 有人知道这样的事情吗?在我脑海中最合适的事情是java.nio缓冲区,比如..协议缓冲区。从JavaDoc: 不可变的字节序列。通过共享对不可变底层字节的引用(如字符串)来支持子字符串。通过在RopeByteString中构建一个片段树

substring()有效地重用了String对象中的底层char[],我想知道是否有一个用于byte[]数组的不可变容器支持对底层数组的类似高效重用

如果它能够处理诸如高效追加和预结束之类的事情,那么就需要额外的注意。如果它是为Maven打包的,还有额外的积分


有人知道这样的事情吗?

在我脑海中最合适的事情是java.nio缓冲区,比如..

协议缓冲区。从JavaDoc:

不可变的字节序列。通过共享对不可变底层字节的引用(如字符串)来支持子字符串。通过在RopeByteString中构建一个片段树,在不复制(长字符串)的情况下也同样支持连接


+1它具有“不可变视图”,并通过
slice
支持子序列。不过,只读缓冲区的位置和限制仍然可以修改,因此您可能需要在其周围创建一个包装类。您能给我一个指向不可变视图的指针吗?我找不到任何对它的引用?老实说,我希望人们不会建议使用ByteBuffer,我发现它们是一个真正的PITA,相对于InputStreams和OutputStreams,由于其基本上是可变的,因此非常容易出错:-/code>asReadOnlyBuffer()隐藏在
asLongBuffer
asShortBuffer
asReadOnlyBuffer()之间
不是不变的。它是只读的。原始constructor仍然可以修改缓冲区。@Gili如果原始数组不再可访问,则它实际上是不可变的
String
,被认为是不可变的,也只是其内部
char[]
上的只读包装器。以及用于创建一个
字符串
实例,该实例具有对其
字符[]
的脏访问权限。最好考虑一个只读缓冲区不可变,因为调用<代码> GET()/代码>更改它的哈希代码。除了BTETShin协议缓冲区之外,我还找不到任何东西,这对于API来说是不理想的。我在Java中写了一篇关于这方面的文章,解释了为什么ByteBuffer不适合,为什么ByteString不适合API。我提到了这个需求,似乎大家都同意Java确实需要它,但他们想定义更大的不变性,而不仅仅是添加这个类。有人需要推动这是一个有趣的。谢谢