ArrayList vs char[].这对于构建成大字符串最有效



我正在逐字节读取数据。 当我确定我有一条完整的消息时,我需要将其作为字符串传递给另一个函数。 有些消息可能很大,但大小经常变化。 你们都认为哪种实现最有效:

public test class
{
   char[] buffer = new char[MAX_SIZE_7200];
   int bufferIndex = 0;
   void parseData(ArrayList<Byte> msg, length)
   {
       while (!msg.isEmpty())
       {
          buffer[bufferIndex++] = (char) msg.remove(0);
          if (isfullmessage)
          {
             parseData(new String(buffer, 0, bufferIndex);
             bufferIndex = 0;  //restart and continue parsing data
          }
       }
   }
 }

或:

public test class
{
   List<Character> buffer = new ArrayList<Character>();
   int bufferIndex = 0;
   void parseData(ArrayList<Byte> msg, length)
   {
       while (!msg.isEmpty())
       {
          buffer.add((char) msg.remove(0));
          if (isfullmessage)
          {
              StringBuilder builder = new StringBuilder(buffer.size());
              for (Character ch: buffer)
              {
                  builder.append(ch);
              }
              parseData(builder.toString());
              buffer.clear();
          }
       }
   }
 }  

或:

public test class
    {
       StringBuilder buffer = new StringBuilder();
       int bufferIndex = 0;
       void parseData(ArrayList<Byte> msg, length)
       {
           while (!msg.isEmpty())
           {
              buffer.append((char) msg.remove(0));
              if (isfullmessage)
              {                  
                  parseData(builder.toString());
                  buffer.clear();  //some stringbuilder clear function
              }
           }
       }
     }  

或者有没有更有效的方法。 请注意,我将保存已完成消息的变量保存在函数范围之外,因为我可能会处理不包含完整消息的数据,并且可能需要多次执行函数才能获得完整的消息并对其进行处理。

使用 StringBuilder。 它支持一次附加一个字符,根据需要扩展容量,并且可以重置以重复使用。

我认为这取决于您消息的平均长度。对于更"完整"的消息,char 将是一个更好的选择,因为它的元素类型

对于稀疏情况,列表模板会更好,因为内存消耗会更低,尽管对象表示的开销很大

您正在通过在循环中删除此 ArrayList 的第一个元素来迭代 ArrayList msg 的元素。ArrayList 将其所有元素存储在一个数组中。删除第一个元素很慢,因为数组中的所有元素(第一个元素除外)都需要复制。

因此,也许最大的开销不是在数组中设置字符或将字符附加到 StringBuilder,但最大的开销可能是对 msg.remove(0) 的重复调用。

您可以使用以下命令解决此问题:

int index = 0;
while (index < msg.length()) {
    buffer[bufferIndex++] = (char) msg.get(index);
    index++;
    // etc.
}

最新更新