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. Linux:Day5 shell编程初步、grep

    bash的基本特性(3) 1.提供了编程环境 程序编程风格: 过程式:以指令为中心,数据服务于指令: 对象式:以数据为中心,指令服务于数据: shell程序:提供了编程能力,解释执行:过程式.解释执行 ...

  2. 二、Oracle 数据库基本操作

    一.oracle常用数据类型数字:number(p,s) p表示数字的长度包括小数点后的位数,s表示小数点后的位数固定长度字符:char(n):n表示最大长度,n即是最大也是固定的长度,当数据不满长度 ...

  3. P1865 A % B Problem

    (一道很水的题) (反正我第一眼看的时候也是这么想的) 题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接 ...

  4. C# — 创建Windows服务

    以前从来没有接触过C#,对Windows服务也完全不了解,今天通过使用VS2017创建了一个Windows服务,并进行了安装和卸载,目前也是一知半解的地步,简单的做个笔记记录一下,也算是复习了吧. 第 ...

  5. Python这么强大, 怎样才能快速入坑?

    作为一种年轻的编程语言,Python为何能在短短几年的时间内就以迅雷不及掩耳之势驰骋编程界?答案很简单,在人工智能时代,AlphaGo 都在使用的 Python语言,是最接近 AI 的编程语言. 随着 ...

  6. Git创建项目基本命令

    前提:先在coding.net上创建项目Paper,并勾选“启用README.md文件”初始化项目. 1.给项目Paper创建版本库(仓库) cd Paper git init 2.把项目文件放到仓库 ...

  7. 【机器学习】SKlearn + XGBoost 预测 Titanic 乘客幸存

    Titanic 数据集是从 kaggle下载的,下载地址:https://www.kaggle.com/c/titanic/data 数据一共又3个文件,分别是:train.csv,test.csv, ...

  8. 提取jedis源码的一致性hash代码作为通用工具类

    一致性Hash热点 一致性Hash算法是来解决热点问题,如果虚拟节点设置过小热点问题仍旧存在. 关于一致性Hash算法的原理我就不说了,网上有很多人提供自己编写的一致性Hash算法的代码示例,我在跑网 ...

  9. ECS上配置FTP Filezilla

    又来搞华为ECS 第一,服务器安装服务端 第二,设置被动模式,把服务器的公网IP填好 第三,生成一个服务器证书,客户端连接时接受 第四,设置自定义的被动连接端口比如 9000-9050 第五,去ECS ...

  10. 从HelloWorld开始学习.NET Core

    1.首先创建一个项目文件夹,如E:\CoreProjects 使用cmd命令进入到新建的文件夹中 2.创建一个HelloWorld项目 命令:dotnet new console -o hellowo ...