C#中,StringBuilder弥补了string在赋值时开辟新空间不足之处。
StringBuilder类型变量会初始化一段长度,供后续对该变量进行增加。当然也可以手动定义其长度
StringBuilder builder = new StringBuilder(10);
其缺点是需要较为精确估算出StringBuilder类型变量的长度,否则若在使用中实际builder长度超出了定义的长度,会自动开辟一段新的StringBuilder空间,并将原先的数据赋值给新的空间,旧的地址就变成了垃圾。
在处理如下案例时,StringBuilder就体现了其比string强大的特性
StringBuilder builder = new StringBuilder(10);
for (int i = 1; i < 10; i++)
{
builder.Append(i); // 0123456789
}
整个操作都是在一处内存地址,提高了内存利用率。在Unity实际开发时也有很大的用处
实例方法
单词反转 Hello world => world Hello
private static StringBuilder t3(string str)
{
string[] str2 = str.Split(' ');
StringBuilder builder = new StringBuilder(str.Length);
for (int i = str2.Length - 1; i >= 0; i--)
{
builder.Append(str2[i]);
if (i != 0)
builder.Append(" ");
}
return builder;
}
// 调用
Console.WriteLine(t3("Hello world")); // world Hello
字符串反转 Hello world => dlrow olleH
private static StringBuilder t4(string str)
{
StringBuilder builder = new StringBuilder(str.Length);
for (int i = str.Length - 1; i >= 0; i--)
builder.Append(str[i]);
return builder;
}
// 调用
Console.WriteLine(t4("Hello world")); // dlrow olleH
字符串查重 Hello world => Helo wrd
private static StringBuilder t5(string str)
{
StringBuilder builder = new StringBuilder(str.Length);
builder.Append(str[0]);
for (int i = 1; i < str.Length; i++)
{
for(int j = 0; j < builder.Length; j ++)
{
if (str[i] == builder[j])
break;
if (j == builder.Length - 1)
builder.Append(str[i]);
}
}
return builder;
}
// 调用
Console.WriteLine(t5("Hello world")); // Helo wrd