Java字节数组

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

可能是Java中字节的内存大小的重复问题。 - Tom
3个回答

7

我不确定你所说的“resized”和“merged”是什么意思。

根据文档:

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

编辑:如果你所说的“resized/merged”是关于数组本身的,那么与其他数组相比,byte数组没有什么特别之处。


+1 在Java中,一个字节是固定大小的8位。[JLS 4.2] (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html) - Fabian Barney
我认为他想要将 byte[] 视为 int[],通过将每4个连续的字节视为一个 int 来实现此目的。 - Karl Knechtel
我需要将对象序列化并以字节形式存储在数组中。我不确定如何知道哪些元素将占用哪个对象,因为每个元素只占用1个字节,而存储的对象可以高达100个字节。 - darksky

6

有两种方法来分配一个数组。

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转换为比特并将其存储在ba2 [0]中?其他元素也是如此吗?我可以在那里存储实际的位,例如10010101吗? - darksky
@Nayefc 请查看原始数据类型。此外,从JDK7开始,有一个字节字面量:byte b = 0b10010101。在以前的版本中,只有十进制、八进制和十六进制值的字面量。 - Sean Patrick Floyd
是的,我知道。但是在你的例子中,如果你将“1”、“2”和“3”分配到一个字节数组中,它会将数字转换为字节并存储吗?它不能将int“1”存储在字节数组中,因为int是32位(即4个字节)。 - darksky
不会,编译器从上下文中知道这是一个字节字面量。这意味着 byte[] s = { 127 } 是合法的,而 byte[] s = { 128 } 不是。 - Sean Patrick Floyd

4

每个元素将占用一个字节的空间。

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

编辑1:

对象头有8字节的开销,数组长度有4字节的开销,总共有12字节的开销。因此,小型数组相对昂贵。

请查看GNU TroveFastutil。它们是使原始集合操作更加容易的库。

编辑2:

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


请注意,所提到的开销取决于JVM的实现。一个JVM实现或版本可能比另一个具有不同的开销。不要编写依赖这些数字的程序,因为它将无法在所有JVM上运行。 - Jesper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接