0

您好 Java 开发人员:

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

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

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

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

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

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

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

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

4

3 回答 3

2

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

于 2013-08-20T22:32:28.217 回答
2

StringBuffer 能够删除它的内容

buffer.delete(0, buffer.length());
于 2013-08-20T22:38:38.347 回答
1

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

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

于 2013-08-22T05:46:49.623 回答