1、什么时候使用String,什么时候使用StringBuilder?
-
字符串一旦创建就不可修改其大小,所以对字符串添加或删除操作比较频繁时,就不要用String,而用StringBuilder。
例如:String a1="abc"; //分配固定大小 a1+="def"; //销毁原先的数据在来分配,代价比较昂贵 StringBuilder sb=new StringBuilder(20); //指定分配大小 sb.Append('abc'); //分配到堆区 sb.Append('def'); //不会被销毁
-
总结:上面的a1和sb在输出结果一样的。但是在内存分配上来说就区别很大了
String 与StringBuilder的区别
-
String申明后再内存中大小是不可修改的,而StringBuilder可以自由宽展大小(String分配在栈区,StringBuilder分配在堆区)
-
1、String
String s1=new String(new char[]{'c','h','i','n','a',});
-
2、StringBuilder
StringBuilder sb=new StringBuilder(5); //当指定分配大小之后,性能就会得到提升。如果超过指定大小系统会当前大小倍增,也就是10,15,20 这样。建议指定大小 sb.Append('china');
-
3、知道它们是如何分配之后就可以很好的区别“==”,“Equals”,“Object。ReferenceEquals(Obj1,Obj2)”。它们的不同了。
1️⃣、在讲双=号这之前,先说一下,java程序员看到这里可能会有点懵。在java中String类型都是放在堆中的。而C#不同,微软堆String类型进行了优化
2️⃣、微软处理字符串的时候用到“散列表”:它是什么呢?简单理解就是当你创建了字符串“china”的时候,当你在创建这个字符串的时候,编译器是不会再去开辟新的内存来存储的。它会指向第一次创建的地址。
3️⃣、看如下代码
string s1 = "china"; string s2 = "china"; String s3 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' }); String s4 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' }); Console.WriteLine(s1 == s2); //True Console.WriteLine(s1.Equals(s2)); //True Console.WriteLine(Object.ReferenceEquals(s1, s2)); //True Console.WriteLine("--------------------------"); Console.WriteLine(s3 == s4); //True 微软对它进行优化, String s1 = new String(new char[] { 'c', 'h', 'i', 'n', 'a' });相当于string s1 = "china";所以上面s1 == s3就为True了。 Console.WriteLine(s3.Equals(s4)); //True Console.WriteLine(Object.ReferenceEquals(s3, s4)); //False Console.WriteLine("--------------------------"); Console.WriteLine(s1 == s3); //True Console.WriteLine(s1.Equals(s3)); //True Console.WriteLine(Object.ReferenceEquals(s1, s3)); //False Console.WriteLine("---------StringBuilder-----------------"); StringBuilder sb1 = new StringBuilder("china"); StringBuilder sb2 = new StringBuilder("china"); Console.WriteLine(sb1 == sb2); //False Console.WriteLine(sb1.Equals(sb2)); //True Console.WriteLine(Object.ReferenceEquals(sb1, sb2)); //False
- 4、总结:
-
1、==它是比较的栈里面的值是否相等(值比较) 2、Equals它比较的是堆里面的值是否相等(引用地址值比较) 3、Object.ReferenceEquals(Obj1,Obj2) 它是比较的是地址是否相等
具体想要了解这三者关系可以查阅下面的连接:
C# ==、Equals、ReferenceEquals 区别与联系 (转载)