【问题标题】:Java Array of BytesJava 字节数组
【发布时间】:2011-11-06 02:56:14
【问题描述】:

如果我用byte[] 创建一个字节数组,每个元素的大小是多少?它们可以调整大小/合并吗?

谢谢,

【问题讨论】:

标签: java bytearray


【解决方案1】:

不知道你所说的调整大小和合并是什么意思

来自文档:

byte: byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。字节数据类型可用于在大型数组中节省内存,其中内存节省实际上很重要。它们也可以用来代替 int ,它们的限制有助于澄清您的代码;变量的范围有限这一事实可以作为一种文档形式。

编辑:如果通过调整大小/合并您谈论的是数组本身,那么与其他数组相比,字节数组并没有什么特别之处。

【讨论】:

  • +1 所以Java中的一个字节是固定大小的8位。 JLS 4.2
  • 我假设他希望能够,例如,通过将 4 个连续字节的集合视为 int 来将 byte[] 视为 int[]。
  • 我需要序列化对象并将它们作为字节存储在数组中。我不确定如何知道哪些元素将占用哪个对象,因为每个元素只占用 1 个字节,而存储的对象最多可以达到 100 个字节。
【解决方案2】:

有两种分配数组的方法。

A) 分配给定大小的空数组:

byte[] ba1 = new byte[18]; // 18 elements

B) 通过指定内容来分配数组

byte[] ba2 = {1,2,3,4,5}; // 5 elements

【讨论】:

  • 对于byte[] ba2 = {1,2,3,4,5}; // 5 elements,它是否将int 1 转换为bites 并将其存储在ba2[0] 中?其余元素也一样吗?我可以在其中存储实际位,例如 10010101 吗?
  • @Nayefc 见Primitive Data types。此外,从 JDK7 开始,还有一个字节文字:byte b = 0b10010101。在以前的版本中,只有十进制、八进制和十六进制值的文字
  • 是的,我知道.. 但是在您的示例中,如果您将“1”、“2”和“3”分配到一个字节数组中,它会将数字转换为字节并存储它吗? ?它不能将 int "1" 存储在字节数组中,因为 int 是 32 位(即 4 个字节)
  • 它会将数字转换为字节并存储它 不,编译器从上下文中知道这是一个字节文字。这意味着byte[] s = { 127 } 是合法的,而byte[] s = { 128 } 是不合法的。
【解决方案3】:

大小将是每个元素一个字节。

它们不能重新调整大小。但是,您可以使用 System.arrayCopy() 自己合并它们,方法是创建一个新数组并将源数组复制到新数组中。

编辑 1:

还有一个 8 字节的对象头开销和一个 4 字节的数组长度开销,总开销为 12 个字节。所以小数组比较贵。

查看GNU TroveFastutil。它们是使处理原始集合更容易的库。

编辑 2:

我在您的回复中读到您正在执行对象序列化。您可能对 ByteBuffers 感兴趣。这些使得将各种原始类型写入包装数组并获得结果数组变得容易。如果您想要轻松序列化结构化数据类型,还可以查看Google protocol buffers

【讨论】:

  • 请注意,上述开销取决于 JVM 实现。一个 JVM 实现或版本可能具有与另一个不同的开销。不要编写依赖这些数字的程序,因为它不适用于所有 JVM。
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2013-01-22
  • 2020-11-18
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多