StringBuilder与String有哪些区别?
System.String具备不可修改性,在程序中这样的特性容易产生性能上的问题。针对这个问题.NET提供的StringBuilder类可以解决类似的问题。
String 和 StringBuilder 对象都可以很方便地处理字符串,它们具备各自的特点,下面将分别进行说明:
System.String具有以下5个特点:
- String是引用类型,在堆上分配内存。
- String对象一旦生成,就不可改变(Immutable)。
- String提供了大量便捷的字符串操作函数。
- String运算时会产生一个新的实例。
- 在程序中定义相等运算符(== 和 !=),可以方便比较 String 对象的值(而不是引用)。
StringBuilder具有以下两个特点:
- StringBuilder对象是动态对象,允许扩充它所封装的字符串中的字符数量。
- 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有哪些区别?的更多相关文章
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- C#中 StringBuilder类 与 String类的区别---(转)
在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...
- 面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别
1.String: /** Strings are constant; their values cannot be changed after they * are created. String ...
- String,StringBuilder,StringBuffer三者的区别
参考 String,StringBuilder,StringBuffer三者的区别 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 1.运行速度 首先说运行速度,或者说是执行速 ...
- Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- Java基础 -- String,StringBuilder,StringBuffer三者的区别
结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...
- Java中的String,StringBuilder,StringBuffer三者的区别(转载)
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- 转:Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- [转载]Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
随机推荐
- 在ASP.NET MVC中使用Redis
一.Redis基本认知 1.含义: REmote DIctionary Server(Redis) | 是一个key-value存储系统 2.特性: 2.1 持久化:可以将内存中的数据保存在磁盘中,重 ...
- 11 python初学 (文件)
对文件的操作分为 3 步: 打开文件: f = open('望月怀古', 'r', encoding='utf8') # 路径可以写绝对路径,也可以写相对路径: 操作 关闭文件: f.close() ...
- 二分法binadySearch的用法
package com.Summer_0420.cn; import java.util.Arrays; /** * @author Summer * 二分法binadySearch的用法(测试) * ...
- 给大家推荐一个C#下文件监听器和资源管理器的示例Demo-含源码
C#下文件监听器和资源管理器的示例Demo:源码下载地址
- AI 可视化
可视化 参考链接: http://www.tensorfly.cn/tfdoc/how_tos/summaries_and_tensorboard.html
- Generative Adversarial Nets[content]
0. Introduction 基于纳什平衡,零和游戏,最大最小策略等角度来作为GAN的引言 1. GAN GAN开山之作 图1.1 GAN的判别器和生成器的结构图及loss 2. Condition ...
- c# 利用百度图像处理【人像分割】一键抠图
百度AI开放平台-人像分割: http://ai.baidu.com/tech/body/seg 注意本文后面的话,百度这个技术效果太差劲了,国外这 https://www.remove.bg/ 个比 ...
- element-ui中 table表格hover 修改背景色
增加样式级别就行啦 .el-table--enable-row-hover .el-table__body tr:hover>td{ background-color: #212e3e !i ...
- 从一个例子入门Mysql储存过程
例子 -- 秒杀执行存储过程 DELIMITER $$ -- 将分隔符; 转换为 $$ -- 定义存储过程 -- 参数: in 输入参数; out 输出参数 -- row_count():返回上一条修 ...
- .NetCore简单学习图谱
一.学习途径 学习.netcore的最佳途径在哪里,无疑是微软官方.netCore指南.它覆盖十分全面,就目前网上经常看到的各种文章都能在微软处找到类似文章,堪称.netcore的百科全书.所以我利用 ...