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

Jas*_*son 0 java performance parsing arraylist character-arrays

我正在逐字节地读取数据.当我确定我有一个完整的消息时,我需要将它作为字符串传递给另一个函数.有些消息可能非常大,但大小经常变化.您觉得哪种实现最有效:

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
          }
       }
   }
 }
Run Code Online (Sandbox Code Playgroud)

要么:

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();
          }
       }
   }
 }  
Run Code Online (Sandbox Code Playgroud)

要么:

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
              }
           }
       }
     }  
Run Code Online (Sandbox Code Playgroud)

还是有更有效的方式.请注意,我将变量保留在函数范围之外,因为我可能会处理不包含完整消息的数据,并且可能会多次执行该函数以获取完整消息并对其进行处理.

Bre*_*den 9

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