【问题标题】:fixed-length StringBuffer in javajava中的固定长度StringBuffer
【发布时间】:2011-11-19 15:49:53
【问题描述】:

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

【问题讨论】:

    标签: java stringbuffer


    【解决方案1】:

    听起来您正在寻找一个循环缓冲区。您可以创建一个char[] 并保持大小以及逻辑开始。然后,当您需要将其转换为字符串时,您只需创建两个字符串(一个从缓冲区末尾开始,一个从开头开始)并将它们连接在一起。不过这会相对昂贵 - 尽可能多地将其作为循环缓冲区。

    请确保在每个操作中您还考虑了缓冲区已满的可能性。示例操作:

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

    【讨论】:

      【解决方案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());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-28
        • 2019-02-28
        • 2020-03-29
        • 2011-01-25
        • 1970-01-01
        • 2018-06-14
        • 2011-05-18
        相关资源
        最近更新 更多