body { font-family: Segoe UI, SegoeUI, Helvetica Neue, Helvetica, Arial, sans-serif }
code { color: rgba(0, 81, 143, 1); background-color: rgba(233, 233, 233, 1); padding: 1px 2px; border-radius: 3px }

一、System.String

string 等价于 System.String

stringSystem.String 的别名。

声明:

 1 string a1 = null;  // 仅仅是一个声明,内存中并没有分配用来存储值的空间。
2
3 string a1 = String.Empty;  // 等价于 "",以新建字符串长度为零的 String 对象,可以减少 NullReferenceException 发生的可能性。
4
5 System.String greeting = "Hello World!";  // 在内存中分配了一个连续性的不可变的储存空间。
6
7 // 长字符串字面量拆分为较短的字符串,从而提高源代码的可读性。
8 // 以下代码将较短的字符串连接起来,以创建长字符串字面量。 在编译时将这些部分连接成一个字符串。 无论涉及到多少个字符串,均不产生运行时性能开销。
9 string text = "Historically, the world of data and the world of objects " +
10 "have not been well integrated. Programmers work in C# or Visual Basic " +
11 "and also in SQL or XQuery. On the one side are concepts such as classes, " +
12 "objects, fields, inheritance, and .NET Framework APIs. On the other side " +
13 "are tables, columns, rows, nodes, and separate languages for dealing with " +
14 "them. Data types often require translation between the two worlds; there are " +
15 "different standard functions. Because the object world has no notion of query, a " +
16 "query can only be represented as a string without compile-time type checking or " +
17 "IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " +
18 "objects in memory is often tedious and error-prone.";

System.String 是不可变类型。 也就是说,出现的用于修改对象的每个操作 System.String 实际上都会创建一个新的字符串。

如下举例:

 1 // 初始化 s1
2 // 内存为 s1 分配了存放字符的空间
3 string s1 = "A string is more ";
4
5 // 初始化 s2
6 // 内存为 s2 分配了存放字符的空间
7 string s2 = "than the sum of its chars.";
8
9 // 内存为 s1 重新分配了新值的空间
10 // 并指向新空间的地址,所以 s1 有了新的值
11 // 无用的s1旧值等待GC垃圾回收
12 s1 += s2;
13
14 System.Console.WriteLine(s1);

以上,假设更多的+或+=等的多次赋值s1,那么 内存在不停的开辟新的空间存放新值赋予s1 ... ... 每次再需要GC分配、压缩、清理... ...

对于执行大量字符串操作的例程 (例如在循环中多次修改字符串的应用程序) ,重复修改字符串可能会显著降低性能。

二、System.Text.StringBuilder

System.Text.StringBuilder对象在缓冲区操作,是一个可变字符串类,缓冲区可随时增加或减少或删除或替换等的字符串的长度。

StringBuilder strb = new StringBuilder();
strb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
strb.AppendLine("\n");
strb.AppendLine("Some code points and their corresponding characters:");
for (int ctr = 50; ctr <= 60; ctr++) {
strb.AppendFormat("{0,12:X4} {1,12}", ctr,Convert.ToChar(ctr));
strb.AppendLine();
}

三、适用场景

string、String StringBuilder

连续性的不可变的内存空间长度;

开辟新的内存空间存放变更后的值;

借助IndexOf、Substring等进行字符搜索。

缓冲区可伸缩的内存空间长度;

(Chars[])字符搜索方式复杂。

字符更改次数很少;

固定数量的串联拼接操作;

大量的字符串搜索。

大量的未知的不确定的更改次数;

字符串非搜索场景

.Net 中的 string、String、StringBuffer 内存处理性能 和 应用场景的更多相关文章

  1. String、StringBuffer、StringBuilder的不同使用场景

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  2. Java中String、StringBuffer、StringBuilder区别与理解

    一.先比较String.StringBuffer.StringBuilder变量的HashCode值 使用System.out.println(obj.hashcode())输出的时对象的哈希码, 而 ...

  3. java中String StringBuilder StringBuffer比较和效率(性能)测试

    string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...

  4. 【JAVA中String、StringBuffer、StringBuilder类的使用】

    一.String类概述 1.String对象一旦创建就不能改变. 2.字符串常量池. 字符串常量池的特点:池中有则直接使用,池中没有则创建新的字符串常量. 例1: public class Strin ...

  5. Java中String,StringBuffer,StringBuilder的区别及其使用

    由于笔试面试经常会问到这个问题,所以在这里先把这些问题搞清楚. String:自JDK1.0开始即有,源码中对String的描述: "Strings are constant; their ...

  6. JAVA中String与StringBuffer的区别

    String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.C ...

  7. java中String和StringBuffer的区别

    前言 String和StringBuffer本质上都是修饰字符串的只是含义不同 StringBuffer叫做字符串缓冲区 首先看下string类的例子 public class Work1 { pub ...

  8. Java中String、StringBuffer和StringBuilder的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6581009.html  在编程中,对于字符串拼接,我们可以用String类重载的+或concat(str).S ...

  9. Java中String,StringBuffer和StringBuilder的区别(转载)

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简 要的说, String 类型和 StringBuffer 类型的主要性 ...

随机推荐

  1. Typora常用编辑方法-一个能将写博客变作享受的工具

    1,标题 ctrl+数字(1~5) 2,序号 数字序号 数字 + . +空格,之后回车换行会自动产生数字序号 非数字序号 有三种 实心圆 ,非实心圆与实心方框 都是 +空格 ,之后按tab键向内缩进, ...

  2. 微信小程序 | app.json配置属性

    app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. widows: 用于设置小程序的状态栏.导航条.标题.窗口背景色. navig ...

  3. Python基础之告警定义与告警抑制

    技术背景 在前面一篇博客中我们介绍了在python中自定义异常以及异常的捕获.这里我们要介绍另外一种形式的用户提醒:告警.我们这里就不给出一些过于官方或者技术的定义了,在实际项目中的使用场景主要有这么 ...

  4. 力扣 - 剑指 Offer 09. 用两个栈实现队列

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 09. 用两个栈实现队列 思路 刚开始想的是用stack1作为数据存储的地方,stack2用来作为辅助栈,如果添加元素直接push入stac ...

  5. elasticsearch 7.7 配置文件:elasticsearch.yml

    # ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticse ...

  6. 别人 echo 、你也 echo ,是问 echo 知多少?-- Shell十三问<第三问>

    别人 echo .你也 echo ,是问 echo 知多少?-- Shell十三问<第三问> 承接上一章所介绍的 command line ,这里我们用 echo 这个命令加以进一步说明. ...

  7. JavaCV 采集摄像头和麦克风数据推送到流媒体服务器

    越来越觉得放弃JavaCV FFmpeg native API,直接使用JavaCV二次封装的API开发是很明智的选择,使用JavaCV二次封装的API开发避免了各种内存操作不当引起的crash. 上 ...

  8. 一文彻底掌握Apache Hudi的主键和分区配置

    1. 介绍 Hudi中的每个记录都由HoodieKey唯一标识,HoodieKey由记录键和记录所属的分区路径组成.基于此设计Hudi可以将更新和删除快速应用于指定记录.Hudi使用分区路径字段对数据 ...

  9. 201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求链接 这个作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在哪些方面 ...

  10. c# 输出一个数组

    关于C#输出一个数组最普遍的方法就是用for 循环语句写 如: int[] a = new int[10];for (int i = 0; i < a.Length; i++) { a[i] = ...