1、分析string与stringbuilder的区别,我们先来看下面一段代码

首先我们使用string进行字符串的拼接

class Program
{
static void Main(string[] args)
{
//StringBuilder sb = new StringBuilder();
string str = null;
//创建一个计时器,计算程序运行的时间
Stopwatch sw = new Stopwatch();
//开始计时
sw.Start();
for (int i = 1; i < 10000;i++ )
{
//sb.Append(i);
str += i;
}
//结束计时
sw.Stop();
//Console.WriteLine(sb.ToString());
Console.WriteLine(str);
//输出程序运行的时间
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
}
}

程序运行结果如下:

我们可以看到此时使用string程序的运行时间为0.125秒左右

下面我们再使用stringbulider

class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
//string str = null;
//创建一个计时器,计算程序运行的时间
Stopwatch sw = new Stopwatch();
//开始计时
sw.Start();
for (int i = 1; i < 10000;i++ )
{
sb.Append(i);
//str += i;
}
//结束计时
sw.Stop();
Console.WriteLine(sb.ToString());
//Console.WriteLine(str);
//输出程序运行时间
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
}
}

此时程序运行结果为

我们可以看到使用stringbuilder程序运行时间只有0.0021秒左右,相比较与string程序运行速度快了许多倍

2、那么为什么stringbuilder的运行速度会比string快那么多呢

首先,我们看string:

(1)、string字符串,为引用类型,其具有不可变性。

我们一般认为的将内存分为五个区域。其中程序员常用的有三个,即栈、堆,静态存储区域。

其中值类型的值存储在栈中,如int类型,而引用类型的值存储在堆中

如下图所示

而一旦我们将str的值改变  str=“李四”  看似我们改变的str的值,实际上

当str=“李四”时,我们在堆中新创建了一个对象“李四”其地址自然发生改变0x001001被干掉,换成了李四在堆中的地址0x002003

即看似我们改变了str的值,实际上却创建了一个新的对象。

我们可以用一个简单的代码看一下其实际的运行情况:

我们使用监视器跟踪str其中 *str跟踪其地址,可以看到此时str的地址为0x00000000

使用逐语句进行调试

当str的值为“张三”后其地址发生了改变

而当str=“李四”后其地址又发生了改变

因此string类型具有不可变性,一旦其值发生了改变,就是一个新的对象。即每次对字符串进行操作时就会产生一个新的对象。

(2)、而StringBuilder类解决了在对字符串进行重复修改的过程中创建大量对象的问题。StringBuilder类以Char为单位向字符串分配空间,所以操作中不需要进行额外的内存分配。

对stringbuilder我们也可以使用上述代码来说明。

我们可以看到整个过程并不会发生地址的改变。

综上,如果操作少量的数据,我们可以使用string

如果有大量的字符拼接等操作,我们应使用stringbuilder。

万丈高楼平地而起,基础最重要!

关于string 与stringbuilder的一些常用方法会在下篇博客简单总结。

string与stringbuilder的区别的更多相关文章

  1. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  2. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  3. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  4. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...

  5. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  6. 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

    String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...

  7. java中String与StringBuilder的区别

    相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE ...

  8. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  9. 在JAVA中,String,Stringbuffer,StringBuilder 的区别

    首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String  不是线程安全的,这意味着在不同线程共享一个String ...

随机推荐

  1. underscorejs-contains学习

    2.12 contains 2.12.1 语法: _.contains(list, item, fromIndex, guard) 2.12.2 说明: list集合包含指定的值则返回true,否则返 ...

  2. 小议window.event || ev

    以前做项目时就遇到这个问题,但是太懒没有总结,今天来总结一下 onclick="alert(arguments.callee)"这句随便放在某个元素中,试试不同的浏览器会有弹出什么 ...

  3. checkbox复选框全选批量删除

    多选框全选实现批量删除 html代码 <body> <form action="" method="post" name="Form ...

  4. CSS实现div居中

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. PHP实现动态生成饼状图 (转载)

    <?php //变量定义,画椭圆弧时的角度大小 define("ANGLELENGTH", 10); /** * 绘制图片 * @param $title 3D图的标题 * ...

  6. UVA 11722 几何概型

    第六周A题 - 几何概型 Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Descriptio ...

  7. ubuntu 的远程桌面

    好久没有弄ubuntu 丢人的啊,先安装了个服务器版,发现好多命令都忘记了,命令行下根本搞不懂 又安装了个桌面版...但是服务器远程么,putty还是搞的头大,又乱码,有各种文件传输. 还好记得以前用 ...

  8. easyui tabs 真正刷新用法

    //刷新当前标签Tabs function RefreshTab(currentTab) { var url = $(currentTab.panel('options')).attr('href') ...

  9. codevs 1107 等价表达式

    传送门 题解:第一眼这题好像非常难得样子,简直没有思路.但是这可以用栈带入特殊值来解决.这里用到两个栈,一个是存贮数字,另一个存贮运算符,按优先级进行运算.当读入的运算符比运算符栈的栈顶元素优先级低时 ...

  10. Nhibernate 分页

    public IList<Student> GetStudentByPage(int pageSize, int pageIndex, string SName) { ISession s ...