.Net 中的 string、String、StringBuffer 内存处理性能 和 应用场景
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
。
string
是 System.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 内存处理性能 和 应用场景的更多相关文章
- String、StringBuffer、StringBuilder的不同使用场景
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- Java中String、StringBuffer、StringBuilder区别与理解
一.先比较String.StringBuffer.StringBuilder变量的HashCode值 使用System.out.println(obj.hashcode())输出的时对象的哈希码, 而 ...
- java中String StringBuilder StringBuffer比较和效率(性能)测试
string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...
- 【JAVA中String、StringBuffer、StringBuilder类的使用】
一.String类概述 1.String对象一旦创建就不能改变. 2.字符串常量池. 字符串常量池的特点:池中有则直接使用,池中没有则创建新的字符串常量. 例1: public class Strin ...
- Java中String,StringBuffer,StringBuilder的区别及其使用
由于笔试面试经常会问到这个问题,所以在这里先把这些问题搞清楚. String:自JDK1.0开始即有,源码中对String的描述: "Strings are constant; their ...
- JAVA中String与StringBuffer的区别
String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结. 在java中有3个类来负责字符的操作. 1.C ...
- java中String和StringBuffer的区别
前言 String和StringBuffer本质上都是修饰字符串的只是含义不同 StringBuffer叫做字符串缓冲区 首先看下string类的例子 public class Work1 { pub ...
- Java中String、StringBuffer和StringBuilder的区别
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6581009.html 在编程中,对于字符串拼接,我们可以用String类重载的+或concat(str).S ...
- Java中String,StringBuffer和StringBuilder的区别(转载)
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简 要的说, String 类型和 StringBuffer 类型的主要性 ...
随机推荐
- 复制粘贴Ctrl+C改为自定义单键
目录 那一瞬间不想用Ctrl+C了 (一)搜索渠道 关键词搜索 (二)方案对比 (三)最终方案Ditto 使用方法 (四)案例 1. 替换Ctrl+C快捷键: 2. 将英文小写替换为大写: 那一瞬间不 ...
- Ubuntu-搭建Clang Static Analyzer环境
其实也就是一个开源的漏洞扫描器 专门扫描C/C++ 0BJECT-C++这种,实不相瞒我搭建了5天这个环境,最后我发现了一种超级方便的办法 前面怎么走的坑还是不分享了吧,由于没有看到前面很多人的办法或 ...
- 利用Navicat premium实现将数据从Oracle导入到MySQL
背景:我们给用户提供了新的直播系统,但客户之前的老系统用的数据库是Oracle,我们提供的新系统用的是MySQL 客户诉求:将老系统中的所有直播数据导入到MySQL中: 思路:我知道Navicat有数 ...
- Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖
1. 背景知识.需求描述与公共依赖 1.1. 背景知识 & 需求描述 Spring Cloud 官方文档说了,它是一个完整的微服务体系,用户可以通过使用 Spring Cloud 快速搭建一个 ...
- CSS3新增了哪些新特性
一.是什么 css,即层叠样式表(Cascading Style Sheets)的简称,是一种标记语言,由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准,是向后兼容的,CSS1/2的 ...
- oo第四单元作业总结暨课程总结
oo第四单元作业总结暨课程总结 一.本单元作业架构设计 本单元需要构建一个UML解析器,通过对输入的UML类图/顺序图/状态图的相关信息进行解析以供查询,其中课程组已提供输入整体架构及输入解析部分,仅 ...
- (五)Struts2处理结果管理
当Action处理完用户请求时,处理结果应该通过视图资源实现,但将哪个视图呈现给浏览者呢.由<result.../>来决定 Action处理完用户请求后,返回一个普通字符串.整个普通字符串 ...
- Java(100-113)【类与对象、封装、构造方法】
1.对象的创建以及使用 Student stu =new Student(); 根据一个类创建一个对象 导包.创建.使用 2.手机练习 有main才能run Phone.java package cn ...
- 字符串函数的实现(三)之strcat
C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp ...
- CPF 入门教程 - 属性和事件(七)
CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...