string与stringbuilder的区别
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的区别的更多相关文章
- String,StringBuffer,StringBuilder的区别
public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?
Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)
String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...
- java中String与StringBuilder的区别
相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE ...
- Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...
- 在JAVA中,String,Stringbuffer,StringBuilder 的区别
首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String 不是线程安全的,这意味着在不同线程共享一个String ...
随机推荐
- Linux makefile 教程 非常详细,且易懂(转)
转自:http://blog.chinaunix.net/uid-27717694-id-3696246.html 原文地址:Linux makefile 教程 非常详细,且易懂 作者:Deem_pa ...
- jQuery解析JSON的问题
在WEB数据传输过程中,json是以文本,即字符串的轻量级形式传递的,而客户端一般用JS操作的是接收到的JSON对象,所以,JSON对象和JSON字符串之间的相互转换.JSON数据的解析是关键. JS ...
- Js点餐加减数量
<button class="add-on" onclick="chgNum(1,'del')" ><i class="icon-m ...
- jquery easy ui 学习 (6) basic validatebox
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 老oj3999孤独一生
孤独一生 Time Limit:10000MS Memory Limit:165536KTotal Submit:23 Accepted:11 Case Time Limit:1000MS Desc ...
- codevs 2806 红与黑
2806 红与黑 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 有一个矩形房间,覆盖正方形瓷 ...
- 转:Hprose for php(一)——快速入门
文章来自于:http://blog.csdn.net/half1/article/details/21095665 本文参考了Hprose官方的用户手册,Hprose官网:http://www.hpr ...
- oracle insert &字符插入问题
例如执行一下语句: insert into NSRXT_SP (SP_ID, SP_TITLE, SP_DESC, SP_URL, SP_TYPE, SP_SUB_TYPE, ADD_TIME, CZ ...
- Children of the Candy Corn (bfs+dfs)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8120 Accepted: 3547 Description The c ...
- -_-#【Backbone】Collection
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...