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. C++ Primer 5th 第11章 关联容器

    练习11.1:描述map 和 vector 的不同. map是关联容器,vector是顺序容器,关联容器与值无关,vector则与值密切相关 练习11.2:分别给出最适合使用 list.vector. ...

  2. underscorejs-min学习

    2.16 min 2.16.1 语法: _.min(list, [iteratee], [context]) 2.16.2 说明: 返回list中的最小值. list为集合,数组.对象.字符串或arg ...

  3. HTML5验证及日期显示

    以前忽略了HTML5的强大功能,谁知有了它数据大部分都不需要自己验证,显示日历也不需要插件啦,一些小功能分享给大家 1.Email输入框,自动验证Email有效性. <!DOCTYPE HTML ...

  4. PHP 读取/导出 CSV文件

    工作中经常会有遇到导入/导出的需求,下面是常用的方法.读取CSV文件,可以分页读取,设置读取行数,起始行数即可.导出CSV文件,用两种方法进行实现. /** * 读取CSV文件 * @param st ...

  5. 大脑皮层是如何工作的 《人工智能的未来》(<On intelligence>)读书笔记

    PS:今年寒假的读书笔记,挖下的坑已无力再填...不过有关智能和人工智能的书还是要继续读的~ 正文: 我觉得书名翻译不是很确切,全书讨论的核心应该更是在“真”智能:讨论对人脑智能的理解,可以怎样帮助我 ...

  6. TIOBE.2017.01最新编程语言排行榜

    Jan 2017     Jan 2016     Change     Programming Language     Ratings     Change1    1        Java   ...

  7. 不通用版(从SVN取版本,通过MAVEN生成JAVA包,通过SALTSTACK传送到远程服务器并自动重启TOMCAT服务)PYTHON代码

    从昨晚写到今天啊, 第一版测试成功了. PHP和JAVA的更新相对来说,PHP的自动化更新是简单多啦~~ 当然,这只是运维工作当中的一环~~ #!/usr/bin/env python # -*- c ...

  8. 软件发布版本区别介绍-Alpha,Beta,RC,Release

    Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用. 是希腊字母的第一位,表示最初级的版本 alpha就是α,beta就是β alpha版就是比 ...

  9. UOJ #78 二分图最大匹配

    #78. 二分图最大匹配 从前一个和谐的班级,有 nl 个是男生,有 nr 个是女生.编号分别为 1,…,nl 和 1,…,nr. 有若干个这样的条件:第 v 个男生和第 u 个女生愿意结为配偶. 请 ...

  10. BZOJ1674: [Usaco2005]Part Acquisition

    1674: [Usaco2005]Part Acquisition Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 259  Solved: 114[Sub ...