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. UITextField AutoComplete iOS输入框内文本自动完成

    当你打开Safari的时候,输入网址,会有许多候选网址,点击后,自动填充到输入框,进入网页. 打开词典查单词的时候,输入前面部分字母,软件会给出符合的候选单词. 这样做的目的,是为了省去用户繁琐的输入 ...

  2. Google Calendar(日历)设置农历生日提醒

    Generate birthday dates base on lunar birthdays for google calendar import Can be used for notifying ...

  3. Asp.net的IP地址屏蔽功能设计

    "IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开." 由此我们了解到,IP地址实际上是一个32位正整数,在C#中可以使 ...

  4. Java学习-----单例模式

    一.问题引入 偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过static来访问呢:如果构造方法是private的话,那么有什么好处呢:如果构造方法是privat ...

  5. [转]python对json的相关操作

    json官方说明参见:http://json.org/ Python操作json的标准api库参考:http://docs.python.org/library/json.html 对简单数据类型的e ...

  6. 编写优美的GTest测试案例

    http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html 使用gtest也有很长一段时间了,这期间也积累了一些 ...

  7. 转:你需要知道的NoSQL数据库10件事

    你需要知道的NoSQL数据库10件事 NoSQL的5个优势 1.弹性扩展 多年来,数据库管理员一直依赖于向上扩展(scale up)-随着数据库负载的增加购买更大的数据库服务器―而不是向外扩展-随着负 ...

  8. BZOJ 3065 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 思路:替罪羊树套权值线段树. 当替罪羊树某个子树大于某个比利(比例)时就暴力重构,本题时间复杂 ...

  9. Oracle 用户权限管理

    SQL> select * from ROLE_SYS_PRIVS where ROLE='RESOURCE'; ROLE PRIVILEGE ADM --------------------- ...

  10. JAVA首选五款开源Web开发框架

    Spring Spring是一个开源的Java/Java EE全功能栈应用程序框架,在JavaEE社区中非常受欢迎,以Apache许可证形式发布,也有.NET平台上的移植版本. Struts2 Str ...