当我调用这个方法时,我得到一个java outOfMemoryError - 我在循环中使用它来按顺序解析许多大文件.我的猜测是result.toString()在循环过程中没有正确收集垃圾.如果是这样,我该如何解决?
private String matchHelper(String buffer, String regex, String method){
Pattern abbrev_p = Pattern.compile(regex);//norms U.S.A., B.S., PH.D, PH.D.
Matcher abbrev_matcher = abbrev_p.matcher(buffer);
StringBuffer result = new StringBuffer();
while (abbrev_matcher.find()){
abbrev_matcher.appendReplacement(result, abbrevHelper(abbrev_matcher));
}
abbrev_matcher.appendTail(result);
String tempResult = result.toString(); //ERROR OCCURS HERE
return tempResult;
}
Run Code Online (Sandbox Code Playgroud) 如何将空格附加到字符串生成器?我需要插入90个空格,在VB我有这个代码,但我很困惑如何写c#任何人可以帮助我
Dim S As New StringBuilder("HELLO")
S.Append(" "c, 90)
S.Append("WORLD")
MessageBox.Show(S.ToString)
Run Code Online (Sandbox Code Playgroud)
谢谢.
我们有一些操作,我们正在进行大量的大型字符串连接,并且最近遇到了内存不足异常.不幸的是,调试代码不是一种选择,因为这是在客户站点发生的.
因此,在研究代码的大修之前,我想问一下:对于大型字符串,StringBuilder的RAM消耗特性是什么?
特别是它们与标准字符串类型相比.字符串的大小超过10 MB,我们似乎遇到了大约20 MB的问题.
注意:这不是速度而是RAM.
我有这个代码来连接一些数组元素:
StringBuilder sb = new StringBuilder();
private RatedMessage joinMessage(int step, boolean isresult) {
sb.delete(0, sb.length());
RatedMessage rm;
for (int i = 0; i <= step; i++) {
if (mStack[i] == null)
continue;
rm = mStack[i].getCurrentMsg();// msg is built upfront, this just returns, it's a getter method call
if (rm == null || rm.msg.length() == 0)
continue;
if (sb.length() != 0) {
sb.append(", ");
}
sb.append(rm.msg);
}
rm.msg=sb.toString();
return rm;
}
Run Code Online (Sandbox Code Playgroud)
重要的是阵列最多可容纳10个项目,所以它并不多.
我的跟踪输出告诉我这个方法被称为18864次,在此方法中花费了16%的运行时间.我可以优化更多吗?
我有以下代码:
delegate string CD();
void MyFunction()
{
stringBuilder.Append((CD)delegate()
{
switch(whatever)
{
case 1 : return "A";
...
default: return "X";
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是stringBuilder附加文本MyNamespace.MyClass+CD而不是A或X.为什么会这样?
大家下午好,我正在使用java.lang.StringBuilder存储一些字符.我不知道我要提前存储多少个角色,除了:
我们如何计算应该使用的最佳初始缓冲区长度?
目前我正在使用,new java.lang.StringBuilder(4000)但这只是因为我以前懒得思考.
StringBuilder htmlResp=new StringBuilder();
int? cuID= 1;
string cuName="Tom";
string cuEmpID="ZXCV";
htmlResp .Append( "<option value=\"" + cuID.Value + "\">" + cuName+" ("+cuEmpID==""? "-":cuEmpID+")"+ "</option>");
html.Resp.ToString();
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么上面的代码(从实际代码中修改)总是给我奇怪的结果:"ZXCV"而不是"Tom(ZXCV)".
有没有人知道背后的原因,如果可能的话可以提供参考?
我们都知道连接字符串会导致效率问题,特别是在循环中.我被教导用来StringBuilder防止这些问题.
所以这:
str += someotherstring
Run Code Online (Sandbox Code Playgroud)
变成这样:
StringBuilder sb = new StringBuilder();
sb.AppendLine(someotherstring);
Run Code Online (Sandbox Code Playgroud)
但我的理解是.NET框架3.5及更高版本中的CLR足够智能,可以为这两种方法输出相同的IL.那么我是否应该在我的团队代码评论中强制执行stringbuilder?
编辑:我认为Servy在评论中点头:
在连接编译时已知的许多字符串时就是这种情况.因此,当在编译时连接多个字符串时,不需要使用SB.当在编译时连接许多未知的字符串时,它不能这样做
我有一个带有一些字符串的ArrayList.我想将ArrayList中的数字列表存储在由逗号分隔的单个字符串中,如下所示.
String s = "350000000000050287,392156486833253181,350000000000060764"
Run Code Online (Sandbox Code Playgroud)
这是我的清单:
List<String> e = new ArrayList<String>();
e.add("350000000000050287");
e.add("392156486833253181");
e.add("350000000000060764");
Run Code Online (Sandbox Code Playgroud)
我一直试图通过以下方式实现:
StringBuilder s = new StringBuilder();
for (String id : e){
s.append(id+",");
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,这会在最后添加一个逗号,我不希望这样.最好的方法是什么?
谢谢
示例代码:
StringBuffer sb = new StringBuffer("hi");
sb = null;
Run Code Online (Sandbox Code Playgroud)
题:
即使在StringBuffer被垃圾收集之后,文字字符串"hi"会以某种方式保留在内存中吗?或者它只是用于为StringBuffer创建一个char数组,然后永远不会放在内存中?