以下代码如何工作?
public void SomeMethod()
{
StringBuilder sb = new StringBuilder();
AppendFoo(sb);
String foo = sb.ToString(); // foo is "foo"
String s = String.Empty;
AppendBar(s);
String bar = s; // bar is empty
}
public void AppendFoo(StringBuilder x)
{
x.Append("Foo");
}
public void AppendBar(String x)
{
x = x + "Bar";
}
Run Code Online (Sandbox Code Playgroud)
如果同时StringBuilder和String被引用类型,为什么字符串对象未通过时,它通过改变AppendBar方法,而路过的时候就到StringBuilder对象被改变AppendFoo的方法,因为这两个参数的方法正在引用类型作为参数?
我需要为数据表中的每一行附加一个Sqlquery.我有36列,并根据每列的数据类型我需要附加sqlquery.任何人都建议我这样做的有效方法.这是编码使用的坏方法"+"运算符在追加之间追加文本?
Following is my code.
query ="INSERT INTO MASTERPI (tag,instrumenttag)");
query += "VALUES ('" + createTagRow["tag"].ToString() + "','" + createTagRow["instrumenttag"].ToString() + "'");
Run Code Online (Sandbox Code Playgroud)
谢谢,Vix
这可能有点代码味道,但我看到它是一些生产代码,即在创建XML文档时使用StringBuilder而不是XmlDocument.在某些情况下,这些是一次写入操作(例如,创建文档并将其保存到磁盘),而其他人正在将构建的字符串传递给XmlDocument,以将XslTransform预先形成为返回给客户端的文档.
如此明显的问题:以这种方式做事是否有价值,是否应该根据具体情况进行,或者这是错误的做事方式?
我有这段代码将StringBuilders的ArrayList转换为字符串的ArrayList:
码:
public ArrayList<String> convGenSeqToString(ArrayList<StringBuilder> buff){
ArrayList<String> convBuf = new ArrayList<String>();
for (StringBuilder xVar: buff){
convBuf.add(xVar.toString());
}
return convBuf;
}
Run Code Online (Sandbox Code Playgroud)
我的代码适用于15-20MB文本文件的文件.但是我有一个44MB的文本文件,每当我用该文本文件运行我的程序时,我总是会收到此错误.
错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2746)
at java.util.ArrayList.ensureCapacity(ArrayList.java:187)
at java.util.ArrayList.add(ArrayList.java:378)
at Recognition.convGenSeqToString(Recognition.java:157)
at Recognition.genSeq(Recognition.java:145)
at Recognition.Recognitions(Recognition.java:96)
at ChainDetection.main(Detection.java:25)
Run Code Online (Sandbox Code Playgroud)
我已经使用-Xmx2048M增加了JVM运行配置中的内存,但仍然存在相同的错误.我将错误指向上面显示的代码并突出显示以下行:
convBuf.add(xVar.toString());
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以将StringBuilder转换为字符串而不使用该.toString()方法?我在其他论坛中看到过,他们也为toString创建了自定义类,但我还不熟悉泛型和一些"@"关键字.任何人都有如何解决这个问题的建议或指导?
我根据vanza的建议编辑了我的代码,它是:
public ArrayList<String> convGenSeqToString(ArrayList<StringBuilder> buff){
ArrayList<String> convBuf = new ArrayList<String>(buff.size());
Iterator <StringBuilder> iterBuf = buff.iterator();
while (iterBuf.hasNext()){
StringBuilder x = iterBuf.next();
convBuf.add(x.toString());
iterBuf.remove();
}
return convBuf;
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
Exception in …Run Code Online (Sandbox Code Playgroud) 我需要StringBuilder sb使用CharBuffer 发送一些内容
我正在跳过类似CharBuffer.wrap( sb)但却无法找到任何优雅的方式
在解决暴力之前,是否有一种巧妙的方法将StringBuilder转换为CharBuffer?
我知道这可能是一个不好的例子,但我在这种情况下的问题更多地与处理StringBuilder而不是我的SQL查询本身的最好/最有效的方法有关,所以请耐心等待...
作为一个示例来展示我想要实现的目标,假设我在数据库中有一个很大的表列表,所有表都具有相同的结构,我想创建一个查询来从一个单独的数据中提取数据查询.
我想这样做的方式是:
Dim MyTables As List(Of String) = {"Table1", "Table2", "Table3" ... "TableN"}.ToList
Dim SQLQuery As New StringBuilder
For Each tbl As String In MyTables
SQLQuery.AppendLine("SELECT [col1], [col2], [col3] FROM " & tbl)
SQLQuery.AppendLine("UNION")
Next
Run Code Online (Sandbox Code Playgroud)
再次,忽略这是否是最好的方法(尽管我很想知道是否有更好的方法,但我不希望答案在这个方向上倾斜 - 我更感兴趣的是如何知道如何在这种情况下有效地处理StringBuilder).
鉴于我这样做的方式,我的StringBuilder将UNION & vbCrLf在我需要删除的末尾有一个额外的 - 我知道我可以使用以下内容:
SQLQuery.Remove(SQLQuery.Length - ("UNION" & vbCrLf).Length, ("UNION" & vbCrLf).Length)
Run Code Online (Sandbox Code Playgroud)
当然,我可以提高效率,但我的问题基本上是使用循环创建这样一个字符串构建器的最佳/最有效的方法,其中"连接器"是一个相当大的字符串,它将是如果你按照我的方式做到了最后?
我知道这个问题是用VB编写的,但我同样对C#中的答案感到满意.谢谢!!!
编辑: - 如何确保StringBuilder在多线程环境中对象是GC?(鉴于我不能使用使用关键字)?
我正在使用StringBuilder多个线程,并StringBuilder为每个被调用的线程创建一个新实例.
我关注的是性能,特别是它为StringBuilder创建这么多实例所占用的内存.
有没有其他方法可以确保GC为我释放内存?(比如调用Dispose等)
编辑:StringBuilder没有实现IDisposable,所以我不能使用using关键字.
编辑:我不想强迫,GC.Collect()因为有多个线程同时运行,他们在它们之间共享资源.其中一些线程处于休眠状态,只是监听事件再次变为活动状态.
import java.util.StringTokenizer;
public class ReverseWords {
public static void main(String[] args) {
StringBuilder output = new StringBuilder();
String str = "This is String , split by StringTokenizer, created by mkyong";
StringTokenizer st = new StringTokenizer(str);
char space =' ';
System.out.println("---- Split by space ------");
while (st.hasMoreElements()) {
//System.out.println(st.nextElement());
output.insert(0,st.nextElement());
output.append(" ");
}
System.out.println(output.toString());
/*System.out.println("---- Split by comma ',' ------");
StringTokenizer st2 = new StringTokenizer(str, ",");
while (st2.hasMoreElements()) {
System.out.println(st2.nextElement());
}*/
}
}
Run Code Online (Sandbox Code Playgroud)
我试图反转一个字符串的单词,这是我得到的:
mkyongbycreatedStringTokenizer,bysplit,StringisThis
Run Code Online (Sandbox Code Playgroud) 我有这个方法,我已经简化了重现问题,任何人都可以解释为什么抛出系统格式异常?
我已经尝试将@添加到格式字符串的开头,以防万一它是转义字符的问题,但它没有帮助.
private void doThing(StringBuilder builder, string inPrimaryKey) {
// At this point the builder.ToString() results in " <div class="v-group width-100 shadowed OrderPanel"
// and inPrimaryKey is "OrderId"
// Throws System.FormatException with the detail "Input string was not in a correct format."
builder.AppendFormat(@" @if (Model.{0} > 0) { <text>StateNonEditable</text> } else { <text>StateEditable</text> }", inPrimaryKey);
}
Run Code Online (Sandbox Code Playgroud)
有点背景,我们使用这段代码生成一个cshtml页面供web应用程序使用,所以stringbuilder最初包含一些html,然后我们在格式部分添加了一些C#MVC Razor.