我不知道我的实现是否有错误或StringBuilder
出错了。从stackoverflow,我知道Java Strings
是不可变的。目前我正在使用StringBuilder
以递归方式进行一些字符串处理。为了使递归更清晰易懂,我使用Queue
来存储StringBuilder
。可以使用String
进行相同的处理,但这会增加执行时间,因此我使用的是StringBuilder
。输入字符串首先转换为StringBuilder
,然后添加到Queue
,之后for循环匹配它的字符并用char
替换子字符串。结果StringBUilder
会添加到Queue
。然后从StringBuilder
中删除元素(Queue
),并以相同的先前方式使用for循环进行处理。重复此过程,直到Queue
不为空。以下是我的代码段 -
Queue<StringBuilder> q = new LinkedList<StringBuilder>();
StringBuilder sb;
q.add(new StringBuilder("abcccc"));
while ((sb = q.poll()) != null) {
int len = sb.length();
for (int i = 0; i < len - 1; i++) {
/*
* Here i am matching charAt(i) with charAt(i+1) and based on
* the characters matching decision is done
*/
StringBuilder rep = new StringBuilder(len - 1);
rep = sb;
rep.replace(i, i + 2, replace);//replace is a string which is a character
q.add(rep);
}
}
这给了我StringIndexOutOfBoundsException
。但是我没有改变原始StringBuilder
的内容,这是某人。我只是创建sb
rep
的副本,然后替换新创建的StringBuilder
的内容。
答案 0 :(得分:3)
rep = sb
未创建sb
的副本。这两个对象现在都指向同一个StringBuilder实例。
答案 1 :(得分:2)
我认为您将sb
引用分配给rep
,而不是创建副本。
如果需要副本,请使用接受字符串作为初始值的StringBuilder构造函数:
StringBuilder rep = new StringBuilder(sb.toString());
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html