java—对字节数组初始化中声明的数组大小感到困惑

fnx2tebb  于 2021-07-07  发布在  Java
关注(0)|答案(5)|浏览(360)

我不确定初始化字节数组时数字的重要性:例如。 byte[] t = new byte[2] .
我在网上看到,数组的大小是固定的,所以不管怎样,数组的长度 t 应该是2对吧?
那么在这个例子中:

byte[] t = new byte[0];
t = "hello".getBytes(StandardCharsets.ISO_8859_1);
System.out.println(t.length);

输出是5?好像 t 只是被所有的元素填满而不在乎大小。
我需要这样的东西,我重复地向字节数组中添加值,而不知道数组最终会有多大,我能不能继续添加类似的东西 t 在这里?

2izufjch

2izufjch1#

如果在更改t之前尝试打印t的长度,则得到0,在覆盖t变量数据之后,新长度为5

byte[] t = new byte[0];
System.out.println(t.length); // result = 0
t = "hello".getBytes(StandardCharsets.ISO_8859_1);
System.out.println(t.length); // result = 5
6xfqseft

6xfqseft2#

在第二行中,您没有替换数组的内容,而是替换了数组本身,这意味着 t 现在指向由“hello”字符串组成的长度为5的数组。

wqsoz72f

wqsoz72f3#

java中的数组大小固定,不能追加。
为此,通常使用arraylist,它是处理动态调整大小的数组的 Package 器。
但是,对于字节,由于自动装箱,这并不理想,在列表中存储基本字节需要额外的内存和性能。
bytearrayoutputstream也是一个围绕数组的 Package 器,用于处理大小调整,但这次是专门针对字节的。使用方法如下:

ByteArrayOutputStream stream = new ByteArrayOutputStream();

byte[] hello = "hello ".getBytes(StandardCharsets.ISO_8859_1);
stream.write(hello, 0, hello.length);
byte[] world = "world".getBytes(StandardCharsets.ISO_8859_1);
stream.write(world, 0, world.length);

byte[] combined = stream.toByteArray();
System.out.println(combined.length); // prints 11

注意:这涉及附加 bytes 因为问题确实如此。在本例中,首先组合字符串,然后一次性获取字节可能更容易。
可以使用 StringBuilder 或是和 + 以及 += 操作员。

n9vozmp4

n9vozmp44#

主要原因是当你使用

t = "hello".getBytes(StandardCharsets.ISO_8859_1);

您创建了具有新长度的全新数组,因此此代码类似

String t = "hi";
t = "hello";
System.out.println(t.length); // 5
mu0hgdu0

mu0hgdu05#

在那个例子中 t 使用零长度数组进行初始化是无用的,当 t 指定的返回值 "hello".getBytes(StandardCharsets.ISO_8859_1); .
它真的应该写没有扔掉的价值,因为

byte[] t = "hello".getBytes(StandardCharsets.ISO_8859_1);
System.out.println(t.length);

相关问题