原文位於 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/09/msdn_string_stringbuilder.aspx

[FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?

这是一个FAQ啰。

今天看见msdn网站上一个范例,讲得很清楚

除了给自己做一个记录,将来上课能用到

也分享给大家。

资料来源:http://msdn.microsoft.com/zh-tw/library/system.string.aspx

=========================================================================================

不变性和StringBuilder 类别

String 对象称为不可变动的 (只读),因为建立它之后便"无法" 修改它的值

看起来好像会修改 String 对象的方法,其实是传回 已修改之后的 "" String 对象。

由于字符串是不变的 (immutable),执行字符串处理例程重复加入或删除单一字符串  可能会大幅影响效能。

例如,下列程序代码使用随机数产生器,在 0x0001 到 0x052F 的范围中建立含 1000 个字符的字符串。

尽管程序代码似乎是使用 字符串串连(C#使用+ 符号。VB使用& 符号)将新的字符附加至名为 str 的现有字符串,

但它实际上会为每个串连作业建立"新的" String 对象

using System;

using System.IO;

using System.Text;

public class Example

{

public static void Main()

{

Random rnd = new Random();

string str = String.Empty;

StreamWriter sw = new StreamWriter(@".\StringFile.txt", false, Encoding.Unicode);

for (int ctr = 0; ctr <= 1000; ctr++) {

str += Convert.ToChar(rnd.Next(1, 0x0530));

if (str.Length % 60 == 0)

str += Environment.NewLine;

}

sw.Write(str);

sw.Close();

}

}

Imports System.IO

Imports System.Text

Module Example

Public Sub Main()

Dim rnd As New Random()

Dim str As String = String.Empty

Dim sw As New StreamWriter(".\StringFile.txt", False, Encoding.Unicode)

For ctr As Integer = 0 To 1000

str &= ChrW(rnd.Next(1, &h0530))

If str.Length Mod 60 = 0 Then str &= vbCrLf

Next

sw.Write(str)

sw.Close()

End Sub

End Module

=========================================================================================

对字符串值进行"多重变更的作业中,您可以使用 StringBuilder 类别取代 String 类别。

与 String 类别执行个体不同的是,StringBuilder 对象是可变的

当您串连、附加或删除字符串中的子字符串时,作业是在单一字符串上执行。

当您完成修改 StringBuilder 对象的值时,可以呼叫其 StringBuilder.ToString()方法,将它转换为字符串。

下列范例会取代所使用的 String 串连介于 1000 的任意字符到 0x0001 到与 StringBuilder 对象的 0x052F。

using System;

using System.IO;

using System.Text;    // for StringBuilder

public class Example

{

public static void Main()

{

Random rnd = new Random();

StringBuilder sb = new StringBuilder();

StreamWriter sw = new StreamWriter(@".\StringFile.txt", false, Encoding.Unicode);

for (int ctr = 0; ctr <= 1000; ctr++) {

sb.Append(Convert.ToChar(rnd.Next(1, 0x0530)));

if (sb.Length % 60 == 0)

sb.AppendLine();

}

sw.Write(sb.ToString());

sw.Close();

}

}

Imports System.IO

Imports System.Text    '--for StringBuilder

Module Example

Public Sub Main()

Dim rnd As New Random()

Dim sb As New StringBuilder()

Dim sw As New StreamWriter(".\StringFile.txt", False, Encoding.Unicode)

For ctr As Integer = 0 To 1000

sb.Append(ChrW(rnd.Next(1, &h0530)))

If sb.Length Mod 60 = 0 Then sb.AppendLine()

Next

sw.Write(sb.ToString())

sw.Close()

End Sub

End Module

以前测试过,字符串相连、StringBuilder的执行速度,请看这篇文章 --

    http://www.dotblogs.com.tw/mis2000lab/archive/2009/11/25/vs2010_vs2008_who_fast.aspx

1.  文字数量大

2.  从数据表的字段取出,且字符串长度忽长忽短时......StringBuilder有绝对的优势。

[FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?的更多相关文章

  1. Day07 - Ruby比一比:Symbol符号与String字串

    前情提要: 第六天我们透过Ruby代码练习public,protected和privatemethod时,发现冒号在前面的参数,:mydraft,:myspace,这些就是符号Symbol.在今天,我 ...

  2. Oracle的字串處理

    Oracle的字串處理 除了寫程式之外,資料庫的應用也是蠻重要的,而SQL語法,用法大致相同,但各公司所出的資料庫還是有所差別,而ORACLE SQL給了相當多的函數應用,下面列了一些函法的名稱和用法 ...

  3. 如何使用 Python 進行字串格式化

    前言: Python有几种方法可以显示程序的输出:数据可以以人类可读的形式打印出来,或者写入文件以供将来使用. 在开发应用程式时我们往往会需要把变数进行字串格式化,也就是说把字串中的变数替换成变量值. ...

  4. DELPHI加密字串(异或运算加密)

    首先有两个自定的转换函数: function myStrToHex(s:string):string; //字串转16进制 var TmpStr:string; i:integer; begin Tm ...

  5. Get與Post的區別--總結隨筆

    關於Get與Post的區別的文章,在網上太多了:有優點有缺點,今天我給各位大哥做一個總結性的隨筆,還請多多包涵~ 首先是W3School上的答案,請查收: GET在浏览器回退时是无害的,而POST会再 ...

  6. [leetcode] 30. 与所有单词相关联的字串(cn第653位做出此题的人~)

    30. 与所有单词相关联的字串 这个题做了大概两个小时左右把...严重怀疑leetcode的judge机器有问题.同样的代码交出来不同的运行时长,能不能A题还得看运气? 大致思路是,给words生成一 ...

  7. Leetcode——30.与所有单词相关联的字串【##】

    @author: ZZQ @software: PyCharm @file: leetcode30_findSubstring.py @time: 2018/11/20 19:14 题目要求: 给定一 ...

  8. C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()

    //自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *st ...

  9. #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端

    原文:#Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端 #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的 ...

随机推荐

  1. 菜鸟-手把手教你把Acegi应用到实际项目中(10)-保护业务方法

    前面已经讲过关于保护Web资源的方式,其中包括直接在XML文件中配置和自定义实现FilterInvocationDefinitionSource接口两种方式.在实际企业应用中,保护Web资源显得非常重 ...

  2. OC基础(22)

    NSMutableString基本概念 NSMutableString常用方法 NSMutableString练习 *:first-child { margin-top: 0 !important; ...

  3. JAVA集合学习

    JAVA中有几种常用的集合类.分别是List,Set,Map等 提示:Eclipse中自动导入包的快捷键  Ctrl+Shift+O 一.List类 父接口:该类是Collection集合接口的子接口 ...

  4. (Loadrunner)Abnormal termination, caused by mdrv process termination.(转)

    Load generator跑了太多用户导致CPU和内存爆满,进程无法处理请求 确认自定义的代码是否释放内存 合理调整或增加思考时间 关闭extended log 尽量避免使用Load generat ...

  5. Unity AssetBundles and Resources指引 (四) AssetBundle使用模式

    本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...

  6. Nodejs文件服务器

    最近一直在忙于一个比较大的项目,在项目中需要有个文件服务器来支持.老鸟们建议我去用NodeJs来实现,我在接手这个项目之前其实并不了解NodeJs,但是一直想去了解.借着这个机会好好去学习一下.下面是 ...

  7. JAVA编写WEB服务器

    一.超文本传输协议  1.1 HTTP请求  1.2 HTTP应答  二.Socket类  三.ServerSocket类  四.Web服务器实例  4.1 HttpServer类  4.2 Requ ...

  8. JavaScript事件小结

    我们都晓得JavaScrip事件的重要性,所以下面小结一下以备后用!   序号 事件 描述 备注 onclick 鼠标点击某个对象时触发此事件 是最常用的事件之一 onchange 用户改变域的内容时 ...

  9. 学习练习 Oracle数据库小题

    Course(课程表) Score(成绩表) Teacher(教师表)

  10. 学习练习 java 不重复的三位偶数

    编写一个Java程序,计算一下1,2,…,9这9个数字可以组成多少个互不相同的.无重复数字的三位偶数. package com.hanqi; //编写一个Java程序,计算一下1,2,…,9 //这9 ...