A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐阳 中级黑马   /  2012-9-14 14:08  /  2178 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String
另外,对于 String 我们不得不多说几句:
1.它是引用类型,在堆上分配内存
2.运算时会产生一个新的实例
3.String 对象一旦生成不可改变(Immutable)
3.定义相等运算符(== 和 !=)是为了比较 String 对象(而不是引用)
我想问的是,那这样明显是使用stringBulider更方便,想改就改,但实际中我们用的更多的是string,而不是stringBulider
stringBulider的缺点在哪里呢?

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

4 个回复

倒序浏览
stringBulider的缺点是不能保证线程安全,全追求速度,占用资源少
回复 使用道具 举报
个人对string 與stringbuild做个终极小结!!!
1; 不同點,string可以直接用來聲明一個字符串類型 ,但是stringbuild不可以直接聲明,它是一個類,必須用聲明實例的方式才能聲明一個字符類型
如:StringBuild str1 =new StringBuild(“hello,world”);
//聲明一個str1的實例,賦初值為”hello,world”;
2; string與stringbuild均是引用類型,但是也不完全是引用類型,str1直接存放在棧上,而初始化值直接存放在 堆上。但是stringbuild是一個完全引用類型,連定義都與類一致。
但是string 卻不完全是引用類型。
如:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 ="hello,world";   
            Console.WriteLine(str1);

            string str2 =str1;

            Console.WriteLine(str2);

            str1 = "this is just test";

            Console.WriteLine(str1);        //再次 輸入的時候就輸出為空了,str1,str2均為空

            Console.WriteLine(str2);

            Console.ReadLine();
        }
    }
}
我們會發現,當我們將str1重新賦值的時候,str2并沒有改變,原因是因為string類型一旦賦值則不能改變,而當重新進行賦值的時候,只是在堆上重新創建了一個副本,因此,此時str1指向了新的賦值引用,而str2仍然引用的是之前的str1值。

再來看看stringbuild:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder str1 = new StringBuilder("hello,world");    //定義一個stringbuild的實例str1,并賦初值
            Console.WriteLine(str1);

            StringBuilder str2 = new StringBuilder();   //再定義一個實例str2,并指向str1
            str2 = str1;

            Console.WriteLine(str2);

            str1.Remove(0,str1.Length);         //清除str1的所有字符串

            Console.WriteLine(str1);        //再次 輸入的時候就輸出為空了,str1,str2均為空

            Console.WriteLine(str2);

            Console.ReadLine();
        }
    }
}
我們會發現,當我們改變str1的值的時候,str2的值也已經改變,這是因為stringbuild 是一個完全的引用。當我們改變str1的值的時候,str2所指向的值也發生了改變。

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
希望在明日 发表于 2012-9-14 23:38
个人对string 與stringbuild做个终极小结!!!
1; 不同點,string可以直接用來聲明一個字符串類型 ,但是s ...

THANK YOU:lol
回复 使用道具 举报
String 的值构成该连续集合的内容,并且该值是恒定的。
由于 String 的值一旦创建就不能再修改,所以称它是恒定的。看似能修改 String 的方法实际上只是返回一个包含修改内容的新 String。

从这里来看:String使用+号连接新字符串,指示返回来一个新的String。也就是说,原来的String和现在的String 可以认为是两个对象的内容。

StringBulider类表示值为可变字符序列的类似字符串的对象。之所以说值是可变的,是因为在通过追加、移除、替换或插入字符而创建它后可以对它进行修改。那么,它可以说成是字符容器,在这个容器里面允许操作。而且它需要使用ToString()方法来将这个对象中的内容转化成String,用于显示!


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马