java - 最快的字节数组连接方法

标签 java performance bytearray concatenation

我得到了一个包含消息的 n 个部分作为字节数组的映射。在最后一 block 进入 map 后,必须连接消息。我找到了两个应该满足要求的解决方案。第一个是使用 System.arraycopy:

public byte[] getMessageBytes() throws IOException {
    byte[] bytes = new byte[0];
    for (final Map.Entry<Short,byte[]> entry : myMap.entrySet()) {
        byte[] entryBytes = entry.getValue();
        byte[] temp = new byte[bytes.length + entryBytes.length];
        System.arraycopy(bytes, 0, temp, 0, bytes.length);
        System.arraycopy(entryBytes, 0, temp, bytes.length, entryBytes.length);
        bytes = temp;
    }
    return bytes;
}

第二个是使用 ByteArrayOutputStream:

public byte[] getMessageBytes() throws IOException {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    for (final Map.Entry<Short,byte[]> entry : myMap.entrySet()) {
        baos.write(entry.getValue());
    }
    baos.flush();
    return baos.toByteArray();
}

从性能和内存使用的角度来看,更好的方法是什么? 是否有更好的串联方式?

最佳答案

由于您可以通过将片段的长度相加来找出消息的大小,所以我会:

  1. 将棋子的长度相加,分配输出数组;
  2. 使用循环arraycopy()将每个片段放入输出数组中的正确位置。

这可能是内存高效且快速的。然而,只有剖析才能说明全部情况。

关于java - 最快的字节数组连接方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10416259/

相关文章:

java - 如何以编程方式将值编译为源文字?

java - 如何在Spring中的@Bean方法中定义可选参数(依赖项)?

java - 在 Recyclerview Viewholder 中,每 10 行(而不是 1 行)后标记多行

java - 在java中将整数转换为字符串的最快方法

javascript - 在没有 Canvas 的情况下将字节数组转换为图像数据

javascript - 将字节字符串返回给 ExternalInterface.call 会引发错误

c# - 此 Web 服务是否接受原始 xml 和对象?

performance - 在 XSLT : xsl:element name ="div" vs. <div> 中寻找更好的性能

performance - 在文件系统中存储图像的最佳文件夹结构?

C# Byte[] 字节数组到 Unicode 字符串