string和StringBuilder

171 阅读4分钟

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