C#系列之String和StringBuilder
前言
首先和博园的各位打声招呼,小弟在博园呆了也有一年多了。平常一有时间就会过来看看文章,学习各位的经验,现在养成了一种一天不来博园,心里就不踏实的习惯,不知道在看我博文的大哥们有没有这个感觉。
读归读,理解归理解,所以我现在想把平常所看的,所读的转成自己的理解,记录下来,以便与各位同行们讨论讨论。如果在我博文里有理解错误的,或者没有充分理解的请大胆指出,小弟先在这里拜谢各位了。
客套话就说到这,下面开始今天的内容。
字符串
- System.String类 
- System.Text.StringBuilder类 
String
string是各位用的最多的类型之一,是一个特殊的引用类型,直接派生于Object,因此它的值储存在托管堆上。构造一个新字符串的时候,不需要用new。
using System;
class Program
{
static void Main(string[] args)
{
string s = "This is right";//这是正确的
Console.WriteLine(s); string b = new String("This is error");//这是错误的
Console.WriteLine(b);
}
}
它是”不可变的“。初始化字符串对象后,该字符串对象的长度、内容都是确定不变的了。这个时候,我们需要更改或者添加字符串,会做一个怎样的动作呢?假如会有这一段代码
using System;
class Program
{
static void Main(string[] args)
{
string s = "I am ";
s += "Sky";
Console.WriteLine(s);//我叫Sky
}
}
1、创建一个新的字符串对象b,运行库会为新对象b分配足够的内存,储存新内容“I am Sky”。
2、变量 s重新指向新对象b。
3、旧对象a没有被任何变量引用,等待垃圾回收。

由于上面的特性,避免复制同一个字符串的多个对象,会利用CLR的字符串留用机制,减少内存的损耗。
什么是字符串留用,CLR初始化的时候会创建哈希表,每构建一个新字符串都会与哈希表匹配,查找是否有相同的字符串,如果匹配,就会返回这个已存在的旧对象,由新变量进行引用。否则,就会创建一个字符串副本添加到哈希表里,Key就是字符串,Value就是string对象在堆上的地址。



由上面可见a和b的托管堆上地址是一样的。假如用new呢?经小平子补充,new出来的字符串是不会记录在哈希表的,因此,接下来的字符串与new出来字符串对象是不一样的。
  

StringBuilder
因为string的”不可变“,导致多次修改字符串的时候会损耗性能,那么这个时候StringBuilder的作用就来了。StringBuilder和String比起来,功能较少,只有基本的属性和增删改的方法。
其实,StringBuilder是由Char数组构成的。构建新的StringBuilder时能设置容量大小,当添加字符串,超过已分配的数组大小时,就会创建一个新的数组,此时容量会翻倍,旧的数据就会等待垃圾回收。
StringBuilder多数方法都是返回同一个StringBuilder对象,那么这个时候就可以,几个操作一起完成。
using System;
using System.Text;
class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
string s = sb.AppendFormat("{0} {1}", "Skyer", "Chen").Remove(,).Replace(' ','-').ToString();
Console.WriteLine(s);//显示结果 Sky-Chen
}
}
写到这里快江郎才尽了,小弟知识浅薄,日后若有长进定会补上。第一次写博文格式排版有点烂,我发现在大牛们的格式特别漂亮。。起码标题很显眼,恳求各位哥指点指点。
C#系列之String和StringBuilder的更多相关文章
- java‘小秘密’系列(一)---String、StringBuffer、StringBuilder
		java'小秘密'系列(一)---String.StringBuffer.StringBuilder 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现b ... 
- java基础解析系列(一)---String、StringBuffer、StringBuilder
		java基础解析系列(一)---String.StringBuffer.StringBuilder 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bu ... 
- C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)
		前言 这一节主要来了解一下类和结构体之间的异同点.以及针对String和StringBuilder的用法.equals和==,其实可以看出很多地方都用到了上一节的值类型和引用类型.堆栈和装箱拆箱操作吧 ... 
- java基础解析系列(九)---String不可变性分析
		java基础解析系列(九)---String不可变性分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---In ... 
- JDK源码分析-String、StringBuilder、StringBuffer
		String类的申明 public final class String implements java.io.Serializable, Comparable<String>, Char ... 
- 33-Java中的String,StringBuilder,StringBuffer三者的区别
		转载自:https://www.cnblogs.com/su-feng/p/6659064.html StringBuilder 详解 (String系列之2) Java中的String,String ... 
- String、StringBuilder、StringBuffer的爱恨情仇
		第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ... 
- java中 String StringBuffer StringBuilder的区别
		* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ... 
- String,StringBuffer,StringBuilder的区别
		public static void main(String[] args) { String str = new String("hello...."); StringBuffe ... 
随机推荐
- java RuntimeException
			总结了一下JAVA中常见的几种RuntimeException,大约有如下几种: NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异 ... 
- 最短路径(Floyd 模板题)
			题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2143&cid=1186 #include<stdio.h> #incl ... 
- jquery 分页控件(一)
			以前一直都是用别人的分页控件,虽然用得很爽,但总觉的还是自己写个小插件比较好,这个插件效果.代码等都有参照别人完成的控件.即便功能并不是那么完善,扩展性也不好,bug或许还很多.个人觉得,适合自己用就 ... 
- 从算法入手讲解如何在SQL Server中实现最优最简
			算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键.在计算机世界中,算法无处不在.数据库是存储数据和执行大批量计算的场所,在数据库中使用一些简单的SQL命令,进行存储.查询.统计.以解决现实世 ... 
- IE下设置unselectable与onselectstart属性的bug,Firefox与Chrome下的解决方案
			在IE下给DIV设置unselectable与onselectstart属性,可以让div的内容不能选中,这个功能在很多情况下,非常有用,但是他的bug太明显, 直接使用一个DIV是可以的,比如: & ... 
- FirstOrDefault
			FirstOrDefault:取序列中满足条件的第一个元素,如果没有元素满足条件,则返回默认值(对于可以为null的对象,默认值为null,对于不能为null的对象,如int,默认值为0) 
- SharePoint默认的欢迎WebPart中超链接样式
			转:http://www.cnblogs.com/Bear-Study-Hard/archive/2010/03/22/1691641.html 在core.css文件中 .ms-SpLinkButt ... 
- ZOJ 3299-Fall the Brick(线段树+离散化)
			题意: n个区间 ,给出区间的左右坐标 ,区间内填满宽度为1的箱子,有m个板子给出板子的高度和左右坐标(同高度不重叠) 所有箱子从上向下落,求每块板子能接到的箱子数. 分析: 首先给的区间很大,一开始 ... 
- 解决session失效之后登陆后重新返回之前的页面
			在全局拦截器设置保存之前的url存入session中 登陆之后的地址再重session中存 request只用作一次请求 如果页面跳转几次的话原来的url就不存在了建议存在session @Overr ... 
- htmlcss笔记--a
			a标签 1.下载:href里面放一个文件或者压缩包时,会下载: 2.锚点:跳转到锚点: href="#id" 跳转到的模块添加一个id,点击id就会跳转到该模块. html标签: ... 
