zoukankan      html  css  js  c++  java
  • String和StringBuilder的区别

    String是固定不变的,在进行字符串连接的时候是新建一个字符串进行赋值,如果对String赋值多次,就会在内存中保存多个这个对象的副本,浪费系统资源。
    StringBuilder是可变的,不用生成中间对象,对于连接字符串操作比较多,或字符串的长度比较长时有较高的效率。
    注意:StringBuilder的内存空间不够也要扩容,如果分配的空间远远大于需要量,也会产生浪费。

    实际例子
    string s = "";
    for (int i = 0; i < 10; i++)
    {
        s += i.ToString();
    }
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++)
    {
        sb.Append(i.ToString());
    }
               
    区别在于:
    第一种的for产生了:
    "0","1"..."9"(10个由i.ToString产生)
    "0","01"..."01...89"(10个由+=产生)
    总共20个字符串实例

    第二种的for产生了:
    "0","1"..."9"(10个由i.ToString产生)
    总共10个字符串实例

    当循环次数和连接的字符串长度增加时,StringBuilder越发表现出优势。
    运行程序
    static void Main(string[] args)
    {
        DateTime d1 = new DateTime();
        DateTime d2 = new DateTime();
        String s = "";
        StringBuilder sb = new StringBuilder();

        d1 = DateTime.Now;
        for (int i = 0; i <= 60000; i++)
        {
            sb.Append("AppendString123321");
        }
        d2 = DateTime.Now;
        double tt = ((TimeSpan)(d2 - d1)).TotalSeconds;
        Console.WriteLine("StringBulider消耗的时间={0}", tt);

        Console.WriteLine("程序正在执行.....");

        d1 = DateTime.Now;
        for (int i = 0; i <= 60000; i++)
        {
            s += "AppendString123321";
        }
        d2 = DateTime.Now;
        double tt2 = ((TimeSpan)(d2 - d1)).TotalSeconds;
        Console.WriteLine("String消耗的时间={0}", tt2);

        Console.WriteLine("StringBulide比String块{0}倍", tt2 / tt);
        Console.WriteLine("程序结束");
        Console.Read();
    }
    运行环境:AMD速龙双核5200+ 2.7GHz,1.75GB内存
    运行结果

  • 相关阅读:
    龟兔赛跑(动态规划)
    Dividing (多重背包 搜索)
    第k大值01背包问题
    FATE(完全背包)
    01背包 和 完全背包 详解
    放苹果(动态规划)
    max Sum(简单动态规划)
    连连看 优先对列 应用2
    尺取法
    Square(强大的剪枝)
  • 原文地址:https://www.cnblogs.com/vipcjob/p/1532745.html
Copyright © 2011-2022 走看看