目录
在c#中string和stringBuilder都用于处理字符串,但是在内层管理和性能上有显著差异。
一,String
1,string的特点:
(1)不可变:string是不可变的,这意味着你每次对字符串进行修改时,都会创建 一个新的字符串,而不是修改原有的字符串
(2)内存管理:在对字符串进行拼接,替换时,c#会创建一个新的字符串对象, 并将新的内容复制到新对象中,这样,如果多次修改的话,可能会导致频繁的内存 分配和垃圾回收,影响性能
例:
string str1 = "Hello";
str1 = str1 + " World"; // 这里会创建一个新的字符串对象
Console.WriteLine(str1); // 输出: Hello World
2,string常用方法
(1)Length
返回字符串的长度(即字符数)
例:
string str = "Hello, World!";
int length = str.Length; // 返回 13
(2)Substring()
Substring()方法用于从字符串中提取子字符串
例:
string str = "Hello, World!";
string sub = str.Substring(7, 5); // 从索引 7 开始,截取 5 个字符
Console.WriteLine(sub); // 输出: World
(3)ToUpper()
将字符串转换为大写
例:
string str = "hello";
string upperStr = str.ToUpper(); // 输出: HELLO
(4)ToLower()
将字符串转换为小写
string str = "HELLO";
string lowerStr = str.ToLower(); // 输出: hello
(5)Trim()
Trim()方法删除字符串开头和结尾的空白字符
例:
string str = " Hello, World! ";
string trimmedStr = str.Trim(); // 输出: Hello, World!
(6)Replace()
Replace()方法用于替换字符串中的字符或子字符串
例:
string str = "Hello, World!";
string newStr = str.Replace("World", "C#"); // 输出: Hello, C#!
(7)Contains()
Contains()方法用于检查字符串是否包含指定的子字符串
例:
string str = "Hello, World!";
bool contains = str.Contains("World"); // 输出: True
(8)StartsWith()
StartsWith()方法检查字符串是否以指定的前缀开始
例:
string str = "Hello, World!";
bool startsWithHello = str.StartsWith("Hello"); // 输出: True
(9)EndWith()
EndsWith()方法检查字符串是否以指定的后缀结尾
例:
string str = "Hello, World!";
bool endsWithExclamation = str.EndsWith("!"); // 输出: True
(10)IndexOf()
IndexOf()方法返回指定子字符串在字符串中的第一次出现的位置。如果未找到,返 回-1
例:
string str = "Hello, World!";
int index = str.IndexOf("World"); // 输出: 7
(11)LastIndexOf()
LastIndexOf()方法返回指定子字符串在字符串中最后一次出现的位置
例:
string str = "Hello, World! Hello!";
int lastIndex = str.LastIndexOf("Hello"); // 输出: 14
(12)Split()
Split()方法用于根据分隔符将字符串拆分成多个子字符串,并返回一个字符串数组
例:
string str = "apple,banana,orange";
string[] fruits = str.Split(','); // 输出: ["apple", "banana", "orange"]
(13)PadLeft()和PadRight()
PadLeft()方法用于在字符串的左边添加指定数量的空格或字符,直到达到指定的总 长度;PadRight()方法用于在字符串的右边添加字符
例:
string str = "Hello";
string paddedLeft = str.PadLeft(10, '*'); // 输出: "*****Hello"
string paddedRight = str.PadRight(10, '*'); // 输出: "Hello*****"
(14)IsNullOrEmpty()
IsNullOrEmpty()方法用于检查字符串是否为 null 或为空字符串
例:
string str1 = "";
string str2 = null;
bool isEmpty1 = string.IsNullOrEmpty(str1); // 输出: True
bool isEmpty2 = string.IsNullOrEmpty(str2); // 输出: True
(15)IsNullOrWriteSpace()
IsNullOrWhiteSpace()方法用于检查字符串是否为 null、空或仅包含空白字符
例:
string str1 = " ";
string str2 = "";
string str3 = null;
bool isWhiteSpace1 = string.IsNullOrWhiteSpace(str1); // 输出: True
bool isWhiteSpace2 = string.IsNullOrWhiteSpace(str2); // 输出: True
bool isWhiteSpace3 = string.IsNullOrWhiteSpace(str3); // 输出: True
(16)Concat()
Concat()方法用于将多个字符串连接成一个新的字符串
例:
string str1 = "Hello";
string str2 = " ";
string str3 = "World!";
string result = string.Concat(str1, str2, str3); // 输出: "Hello World!"
(17)Join()
Join()方法用于将字符串数组的元素连接成一个字符串,使用指定的分隔符
例:
string[] words = { "apple", "banana", "orange" };
string result = string.Join(", ", words); // 输出: "apple, banana, orange"
(18)Format()
Format()方法用于将格式化字符串中的占位符替换为实际的值
例:
string name = "Alice";
int age = 30;
string result = string.Format("My name is {0} and I am {1} years old.", name, age);
// 输出: "My name is Alice and I am 30 years old."
(19)Compare()和CompareTo()
Compare()方法用于比较两个字符串,返回一个整数表示它们的顺序关系。 CompareTo()方法用于将当前字符串与另一个字符串进行比较
例:
string str1 = "apple";
string str2 = "banana";
int comparison = string.Compare(str1, str2); // 输出: -1,因为 "apple" 小于 "banana"
string str3 = "apple";
int comparisonTo = str3.CompareTo(str2); // 输出: -1,因为 "apple" 小于 "banana"
(20)Normalize()
Normalize()方法用于将字符串的 Unicode 字符表示标准化,通常用于处理带有合成字符的字符串
例:
string str = "é"; // "e" 和 "´" 的组合字符
string normalizedStr = str.Normalize(); // 输出: "é"
(21)Equals()
Equals()方法用于比较两个字符串的内容是否相等
例:
string str1 = "Hello";
string str2 = "hello";
bool isEqual = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); // 输出: True
二,StringBuilder
1,可变
stringbuilder是一个可变的字符串构造器,可以在不创建新的字符串对象的情况下对字符串进行修改,这是通过维护一个内部字符数组来实现的,每次修改都会在该数组上进行,而不会创建新的对象
例:
StringBuilder sb = new StringBuilder("Hello");
sb.Append(" World"); // 不会创建新对象,直接在内部字符数组上修改
Console.WriteLine(sb.ToString()); // 输出: Hello World
2,StringBuilder常用方法
(1)Append():将一个字符串追加到当前字符串的末尾
(2)Insert():在指定位置插入一个字符串
(3)Replace():替换字符串中某些字符
(4)Remove():删除字符串中的一部分字符
(5)ToString():将StringBuilder中内容转换为string
例:
StringBuilder sb = new StringBuilder("Hello");
sb.Append(" World"); // 追加 " World"
sb.Insert(5, ","); // 在位置5插入 ","
sb.Replace("Hello", "Hi"); // 替换 "Hello" 为 "Hi"
sb.Remove(2, 3); // 删除从索引2开始的3个字符
Console.WriteLine(sb.ToString()); // 输出: Hi, World
三,string和stringbuilder性能比较
在使用string拼接多个字符串时,会生成多个临时的string对象,导致频繁的内层分配 和垃圾回收
使用stringbuilder进行字符串拼接时,只有一个内部缓冲区的字符串数组被修改,效率 较高
例:
// 使用 string 拼接
string result1 = "";
for (int i = 0; i < 10000; i++)
{
result1 += "a"; // 每次拼接都会生成一个新的 string 对象
}
// 使用 StringBuilder 拼接
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
sb.Append("a"); // 使用内部字符数组,效率更高
}
string result2 = sb.ToString();
四,何时使用string和stringBuilder
1,使用string
(1)字符串不会频繁变化,例如常量字符串、路径、显示信息等
(2)对性能要求不高的场景,且字符串拼接次数较少
2,使用StringBuilder
(1)在需要频繁拼接、修改字符串的场景,例如循环内拼接字符串、构造动态内 容、日志记录等
(2)当涉及大量字符串操作时,StringBuilder可以显著提高性能,减少内层分配
五,总结
总的来说,如果字符串需要频繁修改,建议使用StringBuilder,如果字符串不需要频繁修改,则使用String