2011-09-18 58 views
4

在java中保存固定的字符串缓冲区长度的最佳做法是什么?也就是说,如果固定值为10,并且stringbuffer包含ABCDEFGHIJ,那么当我们追加K时,会导致A被清除,结果值将为BCDEFGHIJK。我在考虑使用StringBuffer的reverse()和setLenght()方法组合,但不知道它的性能如何达到100 K的长度。java中的固定长度的StringBuffer

回答

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()); 
} 
9

这听起来像是你在循环缓冲区之后。您可以创建char[]并保持大小以及逻辑开始。然后当你需要将它转换成一个字符串时,你可以创建两个字符串(一个从缓冲区的末尾开始,另一个从开始)并将它们连接在一起。这将是相对昂贵的 - 尽量保持它尽可能多的时间作为循环缓冲区。

请确保在每次操作时,您还考虑缓冲区而非的可能性已满。采样操作:

public void append(char c) 
{ 
    buffer[(size + start) % maxLength] = c; 
    if (size == maxLength) 
    { 
     start = (start + 1) % maxLength; 
    } 
    else 
    { 
     size++; 
    } 
}