String、StringBuffer、StringBuilder的区别:
String StringBuffer StringBuilder
执行速度 最差 其次 最高
线程安全 线程安全 线程安全 线程不安全
使用场景 少量字符串操作 多线程环境下的大量操作 单线程环境下的大量操作
String: 对于String来说,是把数据存放在了常量池中,因为所有的String,默认都是以常量形式保存,且由final修饰,因此在线程池中它是线程安全的。因为每一个String当被创建好了以后,他就不再发生任何变化,但是它的执行速度是最差的。 我们要创建String的时候,他在常量池中对这些信息进行处理,如果在程序中出现了大量字符串拼接的工作,效率是非常底下的。 因此使用场景是在少量字符串操作的时候才建议直接使用String来操作。
StirngBuffer:(效率不如StringBuilder,但远比String要高) StringBuffer相对于StringBuilder效率要相对低一点,但也远比String要高的多。效率低的原因:对于StringBuffer来说更多的考虑到了多线程的情况,在进行字符串操作的时候,它使用了synchronize关键字,对方法进行了同步处理。 因此StringBuffer适用于多线程环境下的大量操作。
StringBuilder:(没有考虑线程安全问题) 线程安全与线程不安全: 在进行多线程处理的时候,如果多个线程对于这一个对象同时产生操作,会产生预期之外的结果。对于StringBuilder来说,执行效率虽然高,但是因为线程不安全,所以不建议在多线程的环境下对同一个StringBuilder对象进行操作。 因此StringBuilder适用于单线程环境下的大量字符串操作。
在C#中,字符串类型是不可变的,一旦创建就无法更改。类型为string的“Hello World”将占用内存堆上的地址,若修改其为“Hello World!I like C#”将在内存堆上创建一个新的字符串对象,而不是在相同的内存地址修改原始字符串。这种多次更改原始字符串的情况,将会影响性能。
为此,引入StringBuilder,其不在内存中创建新对象,而是动态扩展内存以容纳修改后的字符串。
1.创建一个String Builder对象
可以StringBuilder使用new关键字并传递初始字符串来创建该类的对象。
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder("Hello World!");
或者,还可以使用重载构造函数指定StringBuilder对象的最大容量
StringBuilder sb = new StringBuilder(100);
StringBuilder sb = new StringBuilder("Hello World!", 100);
以上,C#在内存堆上按顺序分配最多100个空间。一旦达到指定容量,此容量将自动加倍。还可以使用capacity或length属性设置或检索 StringBuilder 对象的容量。您可以循环使用for循环来获取或设置指定索引处的字符。
2.从StringBuilder检索字符串
StringBuilder不是字符串。使用ToString()方法从StringBuilder对象检索字符串。
检索的是实际长度的字符串:
for (int i = 0; i < sb.Length; i++)
{
Console.Write(sb[i]);
}
3. 向StringBuilder 添加/追加字符串
使用 Append () 方法在当前 StringBuilder 对象的末尾追加字符串。如果 StringBuilder 还没有包含任何字符串,它将添加它。AppendLine ()方法在字符串的末尾附加换行符。
sb.Append("C#");
sb.AppendLine("Python");
sb.AppendLine("Java");
Console.WriteLine(sb.ToString());
输出:
Hello World!C#Python
Java
4.将格式化的字符串追加到StringBuilder
使用 AppendFormat() 方法将输入字符串格式化为指定的格式,然后追加它。
StringBuilder sb = new StringBuilder();
sb.AppendFormat($"总价:{100:C}");
Console.WriteLine(sb.ToString());
输出: 总价:¥100.00
5. 将 String 插入StringBuilder
使用 Insert() 方法在StringBuilder对象的指定索引处插入一个字符串。
StringBuilder sb= new StringBuilder("Language");
sb.Append(" List:\n");
Console.WriteLine(sb.Length);
sb.AppendLine("C");
sb.AppendLine("C#");
sb.AppendLine("Java");
sb.Insert(15, "Python\n");
Console.WriteLine(sb.ToString());
输出:
15
Language List:
Python
C
C#
Java
6.在StringBuilder中删除字符串
StringBuilder sb = new StringBuilder("Language");
sb.Append(" List:\n");
sb.AppendLine("C#");
Console.WriteLine(sb.ToString());
sb.Remove(16, 1);
Console.WriteLine(sb.ToString());
输出:
Language List:
C#
Language List:
C
7.在StringBuilder中替换字符串
使用该Replace()方法将所有指定的字符串出现替换为指定的替换字符串。
StringBuilder sb = new StringBuilder("Language");
Console.WriteLine(sb.ToString());
sb.Replace("Language", "Program Language");
Console.WriteLine(sb.ToString());
输出:
Language
Program Language
C#判断两个字符串是否相等的五种方法
string str1="Compare"; string str2 = "Compare";
1.第一种判断方式
if (str1==str2)//C#可以直接进行判断
2.第二种判断方式
int result1 = str1.CompareTo(str2);
Console.WriteLine(result1); //输出result1=0
3.第三种判断方式
int result2=String.Compare(str1, str2);
Console.WriteLine(result2); //输出result2=0
注意:后面两种方式需要注意str1和str2是不是为null的情况
4.第四种判断方式 bool result3=str1.Equals(str2); Console.WriteLine(result3); //输出result3=true 5.第五种判断方式 bool result4 = String.Equals(str1,str2); Console.WriteLine(result4); //输出result4=true