面试题答案
一键面试1. 使用 + 运算符
- 原理:在使用
+
运算符拼接字符串时,每次拼接都会创建一个新的字符串对象。因为字符串在C#中是不可变的,即一旦创建,其内容不能被修改。每次+
操作都会在内存中开辟新的空间来存储新的字符串。 - 性能:性能较差,特别是在循环中进行大量拼接操作时。因为每执行一次
+
操作,就会创建一个新的字符串对象,这会导致频繁的内存分配和垃圾回收,消耗大量的时间和内存资源。 - 适用场景:适用于少量字符串的简单拼接,代码简洁直观。例如:
string str1 = "Hello";
string str2 = " World";
string result = str1 + str2;
2. 使用 StringBuilder 类
- 原理:
StringBuilder
类专门用于高效地构建字符串。它内部维护一个可变的字符数组,通过Append
、Insert
等方法对这个数组进行操作,最后通过ToString
方法生成最终的字符串。 - 性能:性能较好,尤其适用于需要进行大量字符串拼接的场景。由于它避免了每次拼接都创建新的字符串对象,只在调用
ToString
方法时才生成最终的不可变字符串,大大减少了内存分配和垃圾回收的开销。 - 适用场景:在循环中进行字符串拼接,或者需要多次修改字符串内容的场景。例如:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++)
{
sb.Append(i.ToString());
}
string result = sb.ToString();
3. 使用 String.Format 方法
- 原理:
String.Format
方法使用格式化字符串和参数列表来生成一个新的字符串。它会根据格式化字符串中的占位符,将对应的参数值插入到合适的位置。 - 性能:性能介于
+
运算符和StringBuilder
之间。它会创建新的字符串对象,但在格式化复杂内容时相对+
运算符更方便。不过,如果需要频繁调用,由于每次都要解析格式化字符串,性能开销也较大。 - 适用场景:适用于需要按照特定格式组合字符串和变量的场景,例如格式化日期、数字等。例如:
int number = 42;
string name = "Alice";
string result = string.Format("The number is {0} and the name is {1}", number, name);
4. 使用 string.Join 方法
- 原理:
string.Join
方法用于将一个字符串数组或实现了IEnumerable<string>
的集合,通过指定的分隔符连接成一个字符串。 - 性能:性能较好,尤其是在拼接多个字符串时。它会预先计算所需的总长度,一次性分配足够的内存,避免了多次内存分配。
- 适用场景:适用于将多个字符串以某种分隔符连接成一个字符串的场景。例如:
string[] parts = { "apple", "banana", "cherry" };
string result = string.Join(", ", parts);
总结:在少量字符串简单拼接时,可使用 +
运算符;在大量字符串拼接或循环拼接时,优先选择 StringBuilder
类;需要按照特定格式组合字符串和变量时,使用 String.Format
方法;将多个字符串以分隔符连接时,使用 string.Join
方法。