System.String具备不可修改性,在程序中这样的特性容易产生性能上的问题。针对这个问题.NET提供的StringBuilder类可以解决类似的问题。

String 和 StringBuilder 对象都可以很方便地处理字符串,它们具备各自的特点,下面将分别进行说明:

System.String具有以下5个特点:

  1. String是引用类型,在堆上分配内存。
  2. String对象一旦生成,就不可改变(Immutable)。
  3. String提供了大量便捷的字符串操作函数。
  4. String运算时会产生一个新的实例。
  5. 在程序中定义相等运算符(== 和 !=),可以方便比较 String 对象的值(而不是引用)。

StringBuilder具有以下两个特点:

  1. StringBuilder对象是动态对象,允许扩充它所封装的字符串中的字符数量。
  2. StringBuilder可以用于修改StringBuilder中的内容。

由于String对象一旦生成,就不可改变,所以每次使用System.String类中的方法时,都需要在内存中创建一个新的字符串对象,这会分配新的空间给该新的对象。如果对字符串执行重复修改,创建一个新的String对象导致的系统开销可能会非常昂贵。如果不创建新的对象,只是修改字符串,则可以使用StringBuilder类。StringBuilder类型可以很好地解决字符串操作的性能问题,在它生成String对象之前,将不会产生任何String对象。一下示例代码对使用StringBuilder和使用String的性能差异做了比较,代码如下:

using System;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string ID = "ID number";
            int number = 20000;
            //使用StringBuilder,并记录使用的时间
            long sbStart = DateTime.Now.Ticks;
            UseStringBuilder(ID, number);
            long sbEnd = DateTime.Now.Ticks;
            //不实用StringBuilder,并记录使用的时间
            long sStrat = DateTime.Now.Ticks;
            UseString(ID, number);
            long sEnd = DateTime.Now.Ticks;
            //输出拼接字符串所花的时间
            Console.WriteLine("使用StringBuilder:" + (sbEnd - sbStart).ToString());
            Console.WriteLine("使用String:"+(sEnd-sStrat).ToString());
            Console.ReadLine();
            Console.Read();
        }

//使用StringBuilder拼接字符串
        static String UseStringBuilder(string ID, int number)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < number; i++)//循环增加字符
            {
                sb.Append(ID + i.ToString());
            }
            sb.Remove(sb.Length - 1, 1);
            return sb.ToString();
        }

//使用string拼接字符串
        static String UseString(string ID, int number)
        {
            string temp = "";
            for (int i = 0; i < number; i++)
            {
                temp += ID + i.ToString();
            }
            return temp;
        }
    }
}
实例程序使用String和StringBuilder的运行结果如下:

使用StringBuilder:87891

使用String:23408203

StringBuilder与System.String 相比,他会保留自己的缓冲区。在针对StringBuilder执行字符串操作时,会首先检查缓冲区的大小,看其是否能否容纳新的字符串。如果发现不够,则会增加需要的内存数量,因此可以做到大幅降低内存配置的操作次数,并可以有效提高性能。

在相同字符串的许多操作上,使用StringBuilder类会比使用String对象更有效率。对于少量的字符串拼接的字符操作,使用String类比较方便。.NET对String对象扩展了许多便捷的字符串处理方法。

StringBuilder与String有哪些区别?的更多相关文章

  1. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  2. C#中 StringBuilder类 与 String类的区别---(转)

      在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...

  3. 面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别

    1.String: /** Strings are constant; their values cannot be changed after they * are created. String ...

  4. String,StringBuilder,StringBuffer三者的区别

    参考   String,StringBuilder,StringBuffer三者的区别 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 1.运行速度 首先说运行速度,或者说是执行速 ...

  5. Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  6. Java基础 -- String,StringBuilder,StringBuffer三者的区别

    结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...

  7. Java中的String,StringBuilder,StringBuffer三者的区别(转载)

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  8. 转:Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  9. [转载]Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

随机推荐

  1. pytorch torchvision.ImageFolder的使用

    参考:https://pytorch-cn.readthedocs.io/zh/latest/torchvision/torchvision-datasets/ torchvision.dataset ...

  2. P1171 售货员的难题--搜索(剪枝)

    题目背景 数据有更改 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0<s ...

  3. 项目Alpha冲刺4

    作业描述 课程: 软件工程1916|W(福州大学) 作业要求: 项目Alpha冲刺(团队) 团队名称: 火鸡堂 作业目标: 介绍第四天冲刺的项目进展.问题困难和心得体会 1.团队信息 队名:火鸡堂 队 ...

  4. mysql远程连接 Host * is not allowed to connect to this MySQL server

    mysql -u root -p mysql>use mysql; mysql>update user set host =’%'where user =’root’; mysql> ...

  5. Vue-比较方法、计算属性和侦听器

    分别用方法.计算属性和侦听器实现当fristName和lastName改变时,fullName跟着改变. 一.方法: html: <div id="app"> {{fu ...

  6. sklearn 数据预处理1: StandardScaler

    作用:去均值和方差归一化.且是针对每一个特征维度来做的,而不是针对样本. [注:] 并不是所有的标准化都能给estimator带来好处. “Standardization of a dataset i ...

  7. SQL Server-聚焦事务、隔离级别详解(二十九)

    前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...

  8. JVM加载类冲突,导致Mybatis查数据库返回NULL的一个小问题

    今天碰到个bug,虽然小,但是有点意思 背景是SpringMVC + Mybatis的一个项目,mapper文件里写了一条sql 大概相当于 select a from tableA where b ...

  9. Jmeter(三十五)_分布式

    jmeter分布式简单步骤说明: 1:添加远程服务器IP到配置文件 在JMETER_HOME / bin / jmeter.properties中,找到名为“ remote_hosts ” 的属性,并 ...

  10. Flask发送邮件

    参考:官方文档:https://pythonhosted.org/Flask-Mail/ 1.安装插件  Flask-Mail (pip install Flask-Mail) 2.配置 Flask- ...