【问题标题】:Java Char Buffer that automatically grows and can be re-used自动增长并可重复使用的 Java Char Buffer
【发布时间】:2013-08-23 03:34:51
【问题描述】:

Java 开发者您好:

我正在寻找一个内置类来存储一系列字符。它需要满足以下条件:

  1. 它可以存储字符值(不仅仅是字节值)
  2. 它有一个 append 方法,如果底层数据结构超过预先分配的大小,它会自动增大大小。
  3. 具有清除内容的方法(即重新使用内存)。
  4. 可以读取给定索引处的条目。

我找到了几个满足其中一些要求但不是全部要求的选项。例如:

  1. CharBuffer 不满足 2。
  2. StringBuffer 不满足 3。
  3. ByteArrayOutputStream 不满足 1。
  4. CharArrayWriter 不满足 4.

我是否误解了这些类之一的文档,还是有人知道满足所有 4 个标准的数据结构?

编辑: 根据标准 3,我并不是指为 GC 释放内存。

我处于需要重复分配和取消分配其中几个缓冲区的情况。在我的用例中,这些缓冲区最终相当大(~ 100 KB),我将有多个线程使用这些缓冲区。

我知道我可以创建一个缓冲区,使用它,然后在完成后对其进行 GC 处理。但是,我发现当您不断地分配和取消分配大部分 JVM(和物理机)内存时,JVM 垃圾收集器的运行速度非常慢。当我开始对内存进行微观管理时(就像在 C++ 中可以做的那样),我发现速度有所提高,方法是分配一次缓冲区然后重新使用它(从而减少触发垃圾收集的频率)。

【问题讨论】:

  • StringBuffer/StringBuilder 不满足3?怎么样?
  • 为什么不使用arraylist
  • 到@HovercraftFullOfEels 点:docs.oracle.com/javase/7/docs/api/java/lang/…
  • 也指向@HovercraftFullOfEels 点。要真正释放 char 缓冲区内存,请在 delete 调用之后使用 trimToSize()。

标签: java char buffer


【解决方案1】:

StringBuilder/StringBuffer 应该满足 3,因为 delete(...) 应该满足您的需求。或者为什么不简单地创建一个新实例并让旧实例被 GC 处理?

【讨论】:

    【解决方案2】:

    StringBuffer 能够删除它的内容

    buffer.delete(0, buffer.length());
    

    【讨论】:

      【解决方案3】:

      我找到的解决方案: StringBuilder 具有 .setLength(0) ,我可以使用它来获取缓冲区以开始重写内容。

      (一个专用的 .reset() 方法会很好。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 2016-05-25
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2020-07-08
        相关资源
        最近更新 更多