如何克隆() StringBuilder

17

有没有办法克隆 StringBuilder?我通过位逐个读取文件,然后将这些位转换为 ASCII 字符,接着收集这些字符到 String Builder 中,当我有例如 8 个字符时,就将该 String Builder 对象放入 Array List 中。然后我清除它并再次执行相同的操作。但是我无法创建新的 string builder,因为内存不够,而且我无法对那个 String Builder 进行更改,因为在 Array List 中也会更改。

所以我想我需要克隆那个 String Builder 并将其放入 Array List 中。只有一个问题,String Builder 没有 clone() 方法。那么我的备选方案是什么?

也许有人可以提供一些关于考虑性能和内存的好方法。

ArrayList characters = new ArrayList(); int counter = 0;

StringBuilder sb = new StringBuilder(blockSize-1);

while (mbb.hasRemaining()) {   

char charAscii = (char)mbb.get();


    counter++;
    charCounter++;

     if (counter == blockSize){

        sb.append(charAscii);
        characters.add(sb);//sb.toString()
        sb.delete(0, sb.length());
        counter = 0;

    }else{

        sb.append(charAscii);

     }

 if(!mbb.hasRemaining()){
    characters.add(sb);
}



}
fc.close();
return characters;

2
我无法创建新的字符串生成器是因为内存不足 - 克隆的StringBuilder将使用类似的内存量,那么这对您有何帮助呢? - DNA
2
new StringBuilder(oldbuilder.toString()) 是复制 StringBuilder 最简单的方法。由于您并没有解释您想要实现什么,所以您可能只需存储 StringBuilder 中的字符串。 - DNA
Yap 理解到这样做也没有帮助。所以,我已经没有选择了,因为这个 characters.add(new StringBuilder(sb)) 会导致 Java 内存溢出异常。 - Streetboy
2个回答

26
如果您没有足够的内存来创建一个新的StringBuilder对象,那么您也没有足够的内存来复制它,使用克隆无法改变这一点。唯一真正的复制StringBuilder对象的方法是new StringBuilder(myBuilder),或者使用等价的方式。如果出现OutOfMemoryException异常,您需要获取更多内存或找到其他减少内存消耗的方法。

1
需要注意的是,这个OutOfMemoryException并不意味着机器内存已经用完,而是JVM达到了它的限制。这可能是机器限制或JVM限制。我建议确保你通过传入例如“-Xmx1024”来告诉Java使用足够的内存。 - SubJunk

1
您可以通过以下方式清除 StringBuilder 对象:

1.

sb.delete(0, sb.length()) 

2.

sb = null;
sb = new StringBuilder();

为了性能,选项1是更好的选择。但你无论如何也无法克隆它。有关克隆的更多信息,请参见:

在第2个语句中,sb = null; 不是必须的,因为 sb = new StringBuilder(); 也会覆盖掉 sb。此外,我认为第1个语句可能会立即影响内存消耗,因为它修改了对象,而第2个语句只是改变了一个变量指向的内容,原始对象仍然存在于内存中,可能成为垃圾回收的候选对象。 - coder34
@LoganMay,我认为1)将使先前分配的内存符合垃圾回收的条件。 - Tapas Bose
我同意这在理论上似乎是可能的。你能指出任何文件说明delete调用所影响的内存是否会立即释放还是需要先进行垃圾回收吗? - coder34

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接