【问题标题】:how to get byte[] from specific position of other byte[] without copy? [duplicate]如何从其他字节[]的特定位置获取字节[]而不复制? [复制]
【发布时间】:2015-02-14 01:17:22
【问题描述】:

在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 但没有任何成功。

【问题讨论】:

标签: java


【解决方案1】:

唯一没有搞砸虚拟机内部的事情(是的,可以通过来回 JNI 调用进行指针运算)使用类似于 Arrays.asList(bytes1).subList(startIndex, endIndex) 的方式(注意asList() 本身不适用于原始数组,您必须编写或在网上找到类似的原始数组实现;http://fastutil.di.unimi.it/docs/it/unimi/dsi/fastutil/bytes/ByteList.html#subList%28int 出现在这里)-请注意,您将得到一个 @987654324 @ 以这种方式查看,而不是 byte[],因为这在 Java 中基本上是不可能的(请注意,VM hack 除外)。

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

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();

【讨论】:

  • 字节[]字节=新字节[100]; for (int i = 0; i
  • @user3668129 请先阅读答案和 API 文档,然后再说明“没有帮助”!如果您想使用带有 offset (.slice()) 的 ByteBuffer,您必须使用 get() 或其他 ByteBuffer 方法,而不是 .array() - 后备数组仍然相同!这正是我从未在我的代码中使用array() 并说“使用数组支持的ByteBuffer 基本上可以直接访问数组或以抽象/修改(例如使用偏移)方式访问缓冲区的原因。 "直接数组访问与 Java 中的抽象(偏移)访问互斥!
【解决方案2】:

很遗憾,你不能。您要求的本质上是 C/C++ 指针算法,而 Java 中没有这样的东西。

但是,如果您愿意使用不同的界面,您可能会遇到Commons Primitives ArrayByteList 的一些运气。这不是一个简单的List&lt;Byte&gt;,因为它由一个真正的bytes 数组支持——因此由于使用Byte 对象而没有内存开销。您仍然会有一些对象开销,但在实际情况下这是可以接受的。

最重要的是,它通过ArrayByteList.subList() 方法支持切片,该方法不会产生副本。你可以查看source code,切片是作为对原始数组的引用加上开始和结束位置的两个标记来实现的。

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

【讨论】:

    【解决方案3】:

    对不起,你不能。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2013-06-28
      • 2019-09-06
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多