我知道,为了良好的实践,StringBuilder应该使用预期内容的容量值进行初始化。否则,编译后增加大小将是一个昂贵的操作。
我的问题是,如果我们不知道预期的大小,应该如何处理?是否有一个标准值/方法来避免幕后昂贵的操作?
如果没有,如果容量大于初始化时给定的值,是否有可能在代码中发出警报/记录?
StringBuilder sb = new StringBuilder("test", 4);
sb.Append('\n');
sb.AppendLine("test1");
sb.AppendLine("test2");
sb.AppendLine("test3");
sb.AppendLine("test4");
Run Code Online (Sandbox Code Playgroud)
looking on IL code there is only one newobj line, but I thought there should be more instances of StringBuilder class since it should increase its capacity by creating new object? Or I got it wrong?
// [3 1 - 3 49]
IL_0000: ldstr "test"
IL_0005: ldc.i4.4
IL_0006: newobj instance void [System.Runtime]System.Text.StringBuilder::.ctor(string, int32)
IL_000b: stloc.0 // sb
// [4 1 - 4 17]
IL_000c: ldloc.0 // sb
IL_000d: ldc.i4.s …Run Code Online (Sandbox Code Playgroud) 我想知道StringBuilder和StringBuffer之间的区别.在StringBuffer中,它自动分配16个字符.当我们添加一个字符串"hello"时,它的容量增加到21.可以有人澄清我的怀疑吗?
从MSDN文章我读到我应该使用StringBuilder而不是连接普通字符串.但是我不知道为什么我会得到以下错误:"在赋值之前使用变量'ShowString'.在运行时可能会产生空引用异常."
以下代码:
Dim ShowString As StringBuilder
Dim ShowSort As StringBuilder
'ShowString.
ShowString.Append("POS,tdate,Product")
'========Show Options==================
If CheckBox1.Checked = True Then
ShowString.Append(",tkey")
End If
If CheckBox2.Checked = True Then
ShowString.Append(",Price")
End If
If CheckBox3.Checked = True Then
ShowString.Append(",FID")
End If
'==========End Show Options============
'=========Sort Options================
If RadioButton1.Checked = True Then
ShowSort.Append("tdate")
If RadioButton8.Checked Then
ShowSort.Append(" desc")
End If
End If
If RadioButton2.Checked = True Then
ShowSort.Append("tkey")
If RadioButton8.Checked Then
ShowSort.Append(" desc")
End If
End If
'=======End Sort Options=============
Dim sort As String …Run Code Online (Sandbox Code Playgroud) 根据以下单元测试方法,StringBuilder远比String.Replace慢,为什么每个人都说StringBuilder更快?我错过了什么吗?
[TestMethod]
public void StringReplace()
{
DateTime date = DateTime.Now;
string template = File.ReadAllText("file.txt");
for (int i = 0; i < 100000; i++)
{
template = template.Replace("cat", "book" );
template = template.Replace("book", "cat");
}
Assert.Fail((DateTime.Now - date).Milliseconds.ToString());
}
[TestMethod]
public void StringBuilder()
{
DateTime date = DateTime.Now;
StringBuilder template = new StringBuilder(File.ReadAllText("file.txt"));
for (int i = 0; i < 100000; i++)
{
template.Replace("cat", "book");
template.Replace("book", "cat");
}
Assert.Fail((DateTime.Now - date).Milliseconds.ToString());
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
StringReplace - 335ms
StringBuilder - 799ms
我有一个字符串= 12.05.2014
而我正试图用"分裂".但由于某种原因它返回空数组.
System.out.println(newDate);
System.out.println(newDate.length());
String [] dateCells = newDate.split(".");
StringBuilder sBuilder = new StringBuilder();
sBuilder.append(dateCells[2]).append(dateCells[0]).append(dateCells[1]);
System.out.println(sBuilder.toString());
Run Code Online (Sandbox Code Playgroud)
输出是:
12.05.2014
10
//empty line
Run Code Online (Sandbox Code Playgroud) 这是一个众所周知的"问题":
sb.AppendLine();
Run Code Online (Sandbox Code Playgroud)
......不会添加一个空行,正如人们所预料(如讨论这里,例如).
但是,人们普遍认为这样可行:
sb.AppendLine(Environment.NewLine);
Run Code Online (Sandbox Code Playgroud)
......但它不适合我.我有这个代码:
for (int i = 0; i < listOfListItems.Count; i++)
{
sb.AppendLine(Environment.NewLine);
lc = listOfListItems[i];
sb.AppendLine(String.Format(@"<p>Request date is {0}; Payee Name is {1}; Remit Address or Mail Stop is {2}; Last 4 of SSN or ITIN is {3}; 204 Submitted or on file is {4}; Requester Name is {5}; Dept or Div Name is {6}; Phone is {7}; Email is {8}</p>",
lc.li_requestDate, lc.li_payeeName, lc.li_remitAddressOrMailStop, lc.li_last4SSNDigitsOrITIN, lc.li_204SubmittedOrOnFile, lc.li_requesterName, lc.li_deptDivName, lc.li_phone, lc.li_email));
}
Run Code Online (Sandbox Code Playgroud)
所有数据都被添加到StringBuilder,然后添加到生成的表单中,但列表项之间没有空格 - …
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication8
{
class Test
{
public StringBuilder a;
/*public Test()
{
a = new StringBuilder();
} */
}
class Program
{
static void Main(string[] args)
{
Test testobj = new Test();
testobj.a.Append("Hello");
Console.WriteLine(testobj.a);
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Test Class的默认构造函数不应该为类中的每个文件调用每个默认构造函数吗?
我正在尝试通过StringBuilder和File.WriteLn()将一个html文件写入磁盘,但该文件缺少几行,因此无用.我的代码是:
private void BuildAndWriteHTMLFile()
{
StringBuilder sb = new StringBuilder();
sb.Append("<!DOCTYPE html>");
sb.Append("<html lang=\"en\">");
sb.Append("<head>");
sb.Append("<meta charset=\"utf-8\">");
sb.Append("<title>Green Bay Packers 2013 Schedule (All times Central)</title>");
sb.Append("<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js\"></script> ");
sb.Append("<script src=\"http://maps.google.com/maps/api/js?sensor=false\"></script> ");
sb.Append("<script src=\"gomap.js\"></script> ");
sb.Append("<!--[if IE]>");
sb.Append("<script src=\"http://html5shiv.googlecode.com/svn/trunk/html5.js\"></script>");
sb.Append("<![endif]-->");
. . . // oodles on noodly code elided for lack of reason to leave it in
sb.Append("this.singleMarker = false;");
sb.Append("this.lockGeocode = false;");
sb.Append("this.markers = [];");
sb.Append("this.tmpMarkers = [];");
sb.Append("this.geoMarkers = [];");
sb.Append("},");
sb.Append("isVisible: function(latlng) {");
sb.Append("return this.map.getBounds().contains(latlng);");
sb.Append("}");
sb.Append("}");
sb.Append("})(jQuery);"); …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个随机生成的字符串.问题是,按照我设置的方式,它继续添加到自身.
我的代码(我从另一个类调用了很多静态变量,所以不要担心那部分)
class Generate1 extends Thread{
@Override
public void run() {
while(RUNNING == true){
generate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void generate(){
for(int i=0;i<length;i++){
int decider = rando.nextInt(6)+1;
if(decider == 1){
sb1.append("A");
}
if(decider == 2){
sb1.append("B");
}
if(decider == 3){
sb1.append("C");
}
if(decider == 4){
sb1.append("D");
}
if(decider == 5){
sb1.append("E");
}
if(decider == 6){
sb1.append("F");
}
}
Log.d("PSS",sb1.toString()); // this here is the stringbuilder being outputted
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将长度设置为2,在我的日志中它看起来像:
DF …
stringbuilder ×10
c# ×5
java ×4
string ×2
capacity ×1
constructor ×1
file-io ×1
loops ×1
performance ×1
splistitem ×1
streamwriter ×1
stringbuffer ×1
vb.net ×1