【问题标题】:Java: Offsetting a byte[] without performing a copy operationJava:在不执行复制操作的情况下偏移字节 []
【发布时间】:2012-11-04 10:10:34
【问题描述】:

我想知道是否可以使用偏移量访问 byte[] 而无需复制数据?
我查看了Arrays.*ByteArrayInputStreamSystem.arraycopy,但它们都需要分配一个新的byte[] 来复制到。

我想要的是与C++中的这个等价的:

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

【问题讨论】:

  • 在 Java 中没有直接的等价物,但例如 String 的实现是为了实现非常相似的事情:substring() 返回一个新的 String 实例,该实例在内部使用完全相同的 @ 987654331@为原文。这将是惯用的 Java 方式。
  • 这就是为什么采用byte 数组的API 通常会有两个额外的参数——offsetlength :)
  • @MarkoTopolnik: substring() 可以那样工作,但不是必须的。我相信 Sun JRE 最近在这方面发生了变化。
  • @MarkoTopolnik,oracle 更改了 substring() ......
  • @MarkoTopolnik 您应该检查更新的版本,b147 是古老的。我认为是在 1.7u6 左右

标签: java arrays performance memory-management bytearray


【解决方案1】:

您可以改为传递ByteBuffer。无需复制即可进行高级、复制、切片。

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

【讨论】:

  • 对于这个我需要它的小任务,它很好;)
【解决方案2】:

不,没有类似的东西。您只需要自己跟踪偏移量。您总是可以创建一个类来封装 (data, offset) 对。

【讨论】:

  • 这很不幸,但我想我必须忍受它。谢谢
  • 你不需要为此创建一个类。 ByteBuffer 正是这样做的(除其他外)。
  • @Dunes:“除其他外”是问题所在 - 如果我想处理一个真正 只是 一个数组和一个偏移量的 API,我会与其在所有其他操作中使用 ByteBuffer,不如只使用它。
  • ByteBuffer 真的很丑而且违反直觉。然而,它在新的 JDK API 中被广泛使用,因此人们可能会接受它是一种基本类型。
  • @irreputable:这远非 basic。当然,它是开箱即用的,但这远非“基本”的描述。
猜你喜欢
  • 2017-01-12
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多