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. JavaScript设计模式之构造函数模式

    一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...

  2. 144 Binary Tree Preorder Traversal(二叉树先序遍历Medium)

    题目意思:二叉树先序遍历,结果存在vector<int>中 解题思路:1.递归(题目中说用递归做没什么意义,我也就贴贴代码吧) 2.迭代 迭代实现: class Solution { pu ...

  3. javascript权威指南学习笔记2

    Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相 ...

  4. Logger之Logger.getLogger(CLass)

    之前一直在使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了. 在项目中 ...

  5. 1、vs2012 mvc3项目ObjectContext类找不到的问题

    在vs2012下找不到ObjectContext类,取而代之的是DBContext,实体对象的Attach方法,上下文的ObjectStateManager对象都找不到,解决办法: 在设计视图中打开E ...

  6. Python读取Excel数据

    今天一同学给我发来一个Excel文件,让我帮他找一些信息,打开一开 8000多条数据.自己手工处理是不可能完成的的啦.作为一名程序员,当然要用程序来处理.处理生活中的问题当然是Python最为方便啦. ...

  7. JMS集群部署问题 java.net.ConnectException: Connection refused; No available router to destination

    1:本地spring配置如下 <!-- JndiTemplate --> <bean id="jndiTpl" class="org.springfra ...

  8. oracle中的日期加减法

    --加法 ) from dual; --加1年 ) from dual; --加1月 ,'yyyy-mm-dd HH24:MI:SS') from dual; --加1星期 ,'yyyy-mm-dd ...

  9. angular2 学习笔记 ( DI 依赖注入 )

    refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency ...

  10. PS/2接口

    ps/2接口标准的发展过程 随着计算机工业的发展,作为计算机最常用输入设备的键盘也日新月异.1981年IBM推出了IBM pc/XT键盘及其接口标准.该标准定义了83键,采用5脚DIN连接器和简单的串 ...