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