...
StringBuilder 是为了增加效率,,,
在 .NET String 是恒等的, 也就是更改不了的,
String 的 s+ 实际上并非是同一个 String 对象...
而是另外创建了一个 String 对象, StringBuilder 是为了增加效率, 
使用一个 对象 对字符串进行操作...我不明白 你这个 StringBuilder 有什么实质意义

解决方案 »

  1.   

    to 2楼
    是为了增加效率  :)你将上面代码中的i改做长一点点的字符串,然后再试试看效率如何
    假设你用javascript做服务端开发,需要输出一些表格数据,我认为我上面的方法比较清晰,且运行效率和工作效率都有提高,从字面上就可以看出意思来,这也是我加了个add方法的原因,使之从字面上更能达意,不看上面对象的定义也能知道这里的td.add的意思我上面有提到……来创建可修改的字符串序列……,换个角度,也有你说的String对象……也就是更改不了的……的意思。从另外一个角度讲,我这里提及.net等只是个引子,如果有错误的话,我坦然接受,毕竟我在.net区一贴都没发过,呵呵。欢迎继续拍砖~~~ 
      

  2.   

    document.write("<h2>使用普通输出</h2>");
    var st = new Date, et, s = new Array, i;
    for (i = 0 ; i < 10000 ; i ++) s[s.length] = i;
    document.write(s.join(""));
    s.length = 0;
    et = new Date;
    document.write("<br />的时间为" + (et - st) + "毫秒");
    这样会快好多的说。。
      

  3.   

    this._buffer[this._buffer.length] = ("object" != typeof str ? str : String(str));
    改成这样也会快一些。。
    被吹走
      

  4.   

    做的不错,考虑在toString后缓冲一下,下次toString没有改变的话返回原缓冲内容,可以提高一下速度
      

  5.   

    我操,狂昏不已!
    楼主是否真的清除StringBuffer类的作用?正如 btbtd(點點點...)(求职中, 联系:13435580019, 邱)  所说,人家.Net Java存在这个类名字刚好一样,或者Mfc的CString,Delphi的TString,都是为了“开发”效率!因为string 在计算机里面都是用ASCII码或者Unicode形式占内存空间的阿,人家封装一个StringBuffer是为了当处理“字符串”长度已发生变化的时候能够自动自动申请或者释放宝贵的内存的功能阿。您这个为的是什么啊,我怎么感觉既降低了开发效率,有降低了执行效率呢?JS 的String 对象原型已经是封装成了这样的功能,继续在JS的脚本层面上作这类封装不就是“画蛇添足”么?很可笑的想法啊,如果仅仅是出于研究好奇,无妨,但是还含着“提高效率”,我就觉得无知了。给你一个我自己实现的的String类,也就是你说的StringBuffer类,.Net我不会,去掉了大部分功能,只保留了和你那个相同功能的地方,真正的学习一下吧。
    class MyString
    {
    static const char *s_pNullStr;
    protected:
        char *m_pData;
        int  m_Length;
    int  m_BufSize;
    void newbuf(const char *m_pData,int len);
    public:
    MyString();
    ~MyString();
    MyString(const char *lpvalue); void Empty(void);
    void setValue(LPCTSTR str); void Insert(long Pos,char c);    void operator = (const char *buf);
        void operator += (const char *strg);
        BOOL operator == (const char *str);
        BOOL operator != (const char *str);
        friend MyString operator + (const MyString & Str1, const MyString & Str2);
    };#define EXPENTSIZE 8MyString::MyString()
    {
    m_pData=NULL;
    m_BufSize=m_Length=0;
    }MyString::MyString(const char *lpvalue)
    {
    m_pData=NULL;
    m_BufSize=m_Length=0;
    setValue(lpvalue);
    }MyString::~MyString()
    {
    Empty();
    }inline void MyString::Empty()
    {
    if (m_pData!=NULL) delete m_pData;
    m_pData=NULL;
    m_BufSize=m_Length=0;
    }void MyString::newbuf(const char *lpvalue,int len)
    {
    if (len<0) len=0;
    Empty();
    m_BufSize=len+EXPENTSIZE;
    m_pData = new char[m_BufSize+2];
    if (lpvalue && len>0)
    {
    int cpyl=strlen(lpvalue);
    if (cpyl>0) {
    cpyl=min(cpyl,len);
    memcpy(m_pData,lpvalue,cpyl);
    m_pData[cpyl]=0;
    m_Length=cpyl;
    }
    }
    else {
    *m_pData=0;
    }
    }void MyString::Insert(long Pos,char c)
    {
    if (Pos<0) return;
    long maxLen=(Pos<m_Length)?(m_Length+1):(Pos+1);
    if ( maxLen>=m_BufSize)
    {
    char *lpold=m_pData;
    m_pData=NULL;
    newbuf(lpold,maxLen+1);
    if (lpold)  delete []lpold;
    }
    if (Pos<m_Length) {
    memmove(m_pData+Pos+1,m_pData+Pos,m_Length-Pos+1);
    }

    *(m_pData+Pos)=c;
    m_Length+=1;//strlen(m_pData);
    *(m_pData+m_Length)=0;
    }void MyString::operator = (const char *lpvalue)
    {
    setValue(lpvalue);
    }void MyString::operator += (const char *strg)
    {
    Insert(m_Length,strg);
    }MyString operator + (const MyString & Str1, const MyString & Str2)
    {
        MyString TempStr(Str1);
    TempStr+=Str2;
        return TempStr;
    }BOOL MyString::operator == (const char *str)
    {
    if (m_pData==NULL || str==NULL || m_Length<1) return FALSE;
    return (strcmp(m_pData,str)==0);
    }BOOL MyString::operator != (const char *str)
    {
    return !(*this==str);
    }void MyString::setValue(LPCTSTR lpvalue)
    {
    Empty();
    if (lpvalue==NULL) return;
    newbuf(lpvalue,strlen(lpvalue));
    }实现了你的基本功能.注意#define EXPENTSIZE 8 这行,这才是为了提高效率做的事情,也是所谓字符串缓冲区(察看一下MSDN你就明白了http://msdn2.microsoft.com/zh-cn/library/system.text.stringbuilder(VS.80).aspx),如果你认为现在流行的计算机配置都是1G ram,那么你大可把它设置成64,不是每一次字符串变化都需要重新申请内存的,那很慢的。每次看到JS里面某些人这这些毫无意义,并且本身根本不了解JS或者程序仅仅是扛着几颗五角星大喊特喊提高效率说一些“人家都听不明白的专用词”糊弄不懂得人,我都觉得可笑。
      

  6.   

    llrock(百乐宝||昨夜星辰) :老僵尸出土了。
      

  7.   

    骂人有什么好的?
    javascript的string也是非可变类,你搞清了没有
    你认为n个字符串用加号连起来和使用join这个内嵌函数连起来这两种方法会具有相同的效率么?
    楼主连试验的结果都有,真搞不清你们为什么要说效率没有提高?
    一群纸上谈兵的家伙。。
    本身这个想法就很有特色,尤其是对javascript这种有时候需要大量拼接字符串的脚本语言
    还有你那个MyString的+号运算的效率不好
    完全可以先分好缓冲区,再拷贝字符串,没必要先生成字符串,再伸缩缓冲区拷入另一个字符串
    不能原地工作的操作在这种类里面最好不要建议用户使用
      

  8.   

    年底被老板扣了红包,心情实在糟,脾气长了。
    也不是想骂人,就是发泄一把。好多年没来过这里了,跟一个以前的同事聊起csdn,于是回来看看。在这里待了一年时间呢。
    来了没多久就看到很多很无聊的东西,于是很感慨,怀念当年“孟子张”“秋水无痕”的年代。
    那个时候好像没有太多这种东西,大多都是在想办法解决一些很实用的问题。
    回来看看,好像认识的只有梅花雨了,其他的好像都不在了。
      

  9.   

    我觉得这个比那些老问HelloWorld的好多了
    这个论坛现在有人问的问题让人哭笑不得
    讨论一下这些问题还让人有点眼前一亮的感觉
      

  10.   

    to llrock(百乐宝||昨夜星辰) :只管喷,喷到你服为止。另:分红是什么,年终奖又是什么我都还不知道呢,你只是被扣了,想想不知道还有多少人没有,你已经很幸福了,还有,为什么被扣了?是老板的原因你就去捅他两刀,是自己的原因你就捅自己两刀,结果你跑来把我,毫不相干的一个人捅了!一点小事也能看出一个人的秉性,我是老板的话可能就不光红包的事了。再者,我已经说了前面的只是个引子而已。打个比方,你说出水芙蓉,然后借“芙蓉”俩字引出你老婆芙蓉姐姐,说她怎么样怎么样,目的是为了让别人来说你老婆芙蓉姐姐,结果偏有人揪住说芙蓉是草本植物,你老婆不是,还拿出一盆万寿菊来,有意思么。你的作文可能很有深度,可惜,跑题了。想起了鸟笼山里的傻大木……等我把地球毁了,我给你发红包。呵呵,晚上结贴
      

  11.   

    狂日,楼上大家讲得是什么啊,我不懂啊,真不懂,什么是StringBuffer类啊,我是半路出家,基础类的东东一点不懂(正则也不懂),我只知道到目录为止碰到的JS问题我都能解决(甭管效率),呵呵,也可能是我没碰到过有什么深度的问题吧。
    我认为,能解决问题的方法就是好方法