在java中固定stringbuffer长度的最佳做法是什么?也就是说,如果固定值为10且stringbuffer保持ABCDEFGHIJ,当我们追加K将导致A被清除并且结果值将是BCDEFGHIJK。我正在考虑使用StringBuffer的reverse()和setLenght()方法组合但不知道它的性能如何达到100 K长度。
答案 0 :(得分:9)
听起来像是在循环缓冲区之后。您可以创建char[]
并保持大小和逻辑起点。然后,当您需要将其转换为字符串时,您可以创建两个字符串(一个来自缓冲区的末尾,另一个来自开头)并将它们连接在一起。这将是相对昂贵的 - 尝试尽可能多地保持它作为循环缓冲区。
确保在每次操作时,您还要考虑缓冲区不的可能性。示例操作:
public void append(char c)
{
buffer[(size + start) % maxLength] = c;
if (size == maxLength)
{
start = (start + 1) % maxLength;
}
else
{
size++;
}
}
答案 1 :(得分:2)
您可以使用delete:
void append(String s) {
buffer.append(s);
if(buffer.length() > MAX_LENGTH){
buffer.delete(0, buffer.length() - MAX_LENGTH);
}
}
更新:如果参数是长字符串,则会导致不必要的StringBuffer分配。为避免这种情况,您可以先缩短缓冲区,然后根据需要仅附加字符串的多个字符:
void append(String s) {
if (buffer.length() + s.length() > MAX_LENGTH) {
buffer.delete(0, buffer.length() + s.length() - MAX_LENGTH);
}
buffer.append(s, Math.max(0, s.length() - MAX_LENGTH), s.length());
}