字符串的不可变性--转载

字符串的不可变性

字符串

(1).字符串的不可变性

因为字符串具有不可以变性,当我们给一个字符串变量,重新赋值的时候,

字符串原来的值还存在于堆中,只是栈中的指向地址改变了.

这个时候,有一个问题,如果我们需要对一个字符串进行大量的赋值操作,

这样的话内存中就会存在很多无用的垃圾.

当程序结束的时候,GC扫描整个内存,如果发现空间没有被指向.就会销毁这个

空间.

2自动优化功能:

(2).我们可以将字符串看做是char类型的一个只读数组.

  1. namespace _07.字符串的第二个特性
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. //可以将string类型看成char类型的一个只读数组
  8. string s = "abcdefg";
  9. //既然可以将string看做char类型的只读数组,所以我们可以通过下标去访问字符串中的某一个元素
  10. char c1 = s[0];
  11. Console.WriteLine(c1); //获得了a
  12. //s[0] = ‘b‘; 不能这样做因为是只读的
  13. //如果我们非要改变第一个元素的值为‘b‘怎么办呢?
  14. //首先我们要将字符串转换成char数组
  15. char[] c2 = new char[s.Length];
  16. for (int i = 0; i < s.Length; i++)
  17. {
  18. c2[i] = s[i];
  19. }
  20. //然后我们再修改第一个元素
  21. c2[0] = ‘b‘;
  22. //最后我们在将这个字符数组转换成字符串
  23. //string s2 = ""; 频繁的给一个字符串变量赋值由于字符串的不可变性,会产生大量的内存垃圾
  24. StringBuilder s2=new StringBuilder(); //使用StringBuilder频繁的接受赋值就不会产生垃圾
  25. for (int i = 0; i < c2.Length; i++)
  26. {
  27. s2.Append(c2[i]);
  28. }
  29. string s3 = s2.ToString(); //最后再转换成string类型
  30. Console.WriteLine(s3);

    //当然也可以用ToCharArray()方法转换

    // char[] chs = s.ToCharArray();

    //Console.ReadLine(chs);

  1. Console.ReadKey();
  2. }
  3. }
  4. }

StringBuilder类的作用

使用StringBuilder类,产生的对象,进行不停的赋值就不会产生很多的内存垃圾,

提成了运行效率

验证:

在不使用stringBuilder的情况下:

  1. namespace _08.StringBuilder的使用
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. string str = null;
  8. Stopwatch sw = new Stopwatch(); //用来测试代码执行的时间
  9. sw.Start(); //开始计时
  10. for (int i = 0; i < 100000; i++)
  11. {
  12. str += i;
  13. }
  14. sw.Stop();
  15. Console.WriteLine(str);
  16. Console.WriteLine(sw.Elapsed); //获取代码运行的时间
  17. Console.ReadKey();
  18. }
  19. }
  20. }

耗费时间:

    大约有14秒

我们现在使用StringBulider来验证:

  1. namespace _08.StringBuilder的使用
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. string str = null;
  8. StringBuilder sb = new StringBuilder();
  9. Stopwatch sw = new Stopwatch(); //用来测试代码执行的时间
  10. sw.Start(); //开始计时
  11. for (int i = 0; i < 100000; i++)
  12. {
  13. sb.Append(i);
  14. }
  15. sw.Stop();
  16. str = sb.ToString();
  17. Console.WriteLine(str);
  18. Console.WriteLine(sw.Elapsed); //获取代码运行的时间
  19. Console.ReadKey();
  20. }
  21. }
  22. }

消耗时间:

仅仅使用了0.1毫秒

时间: 2024-08-12 23:57:21

字符串的不可变性--转载的相关文章

20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class 类名 { 字段; 属性; 方法; } 写好了一个类之后,我们需要创建这个类的对象,那么,我们管创建这个类的对象过程称之为类的实例化.使用关键字new 实例化类===创建类 this:表示当前这个类的对象. 类是不占内存的,而对象是占用内存的. 结构是面向过程的,类是面向对象的,之前没有面向对象的时候

04.字符串的不可变性

字符串 (1).字符串的不可变性  因为字符串具有不可以变性,当我们给一个字符串变量,重新赋值的时候, 字符串原来的值还存在于堆中,只是栈中的指向地址改变了. 这个时候,有一个问题,如果我们需要对一个字符串进行大量的赋值操作, 这样的话内存中就会存在很多无用的垃圾. 当程序结束的时候,GC扫描整个内存,如果发现空间没有被指向.就会销毁这个 空间.  (2).我们可以将字符串看做是char类型的一个只读数组. namespace _07.字符串的第二个特性 { class Program { st

字符串哈希 (转载)

基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m>=n,如果对于不同的key1,key2属于X,有h(key1)!=h(key2),那么称h为完美哈希函数,当m=n时,h称为最小完美哈希函数(这个时候就是一一映射了). 在处理大规模字符串数据时,经常要为每个字符串分配一个整数ID.这就需要一个字符串的哈希函数.怎么样找到一个完美的字符串hash函数呢?有

python字符串编码理解(转载)

(转载)字符编码和python使用encode,decode转换utf-8, gbk, gb2312 (http://www.cnblogs.com/jxzheng/p/5186490.html) ASCII码 标准ASCII码使用7位二进制数表示大写或小写字母,数字0到9标点符号以及在美式英语中使用的特殊控制字符. 在标准ASCII码中,最高位(b7)用作奇偶校验位,所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分寄校验和偶校验两种.奇校验规定:正确的代码一个字节中1的

iOS HTML标签字符实体,转译字符串归类大全 【转载】

为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢? 这就要说到HTML转义字符串(Escape Sequence)了. 转义字符串(Escape Sequence)也称字符实体(Character Entity).在HTML中,定义转义字符串的原因有两个: 第一个原因是像"<"和">

byte[]数组与十六进制字符串与字符串的互相转换 ——转载

字符串转换成十六进制字符串方法1: /**      * 字符串转换成十六进制字符串     */      public static String str2HexStr(String str) {          char[] chars = "0123456789ABCDEF".toCharArray();          StringBuilder sb = new StringBuilder("");        byte[] bs = str.ge

SQL 拼接字符串(字符串中有变量) 转载的

http://blog.csdn.net/sikaiyuan2008/article/details/7848926 sql server数据库存储sql SQL SERVER拼接字符串(字符串中有变量)  总是忘记规律,转载过来以帮助记忆. 一.拼接字符串(整个字符串不分割)步骤: 首先在字符串的前后加单引号: 字符串中的变量以'''[email protected]+'''在字符串中表示: 若在执行时存在类型转换错误,则应用相应的类型转换函数,对变量进行类型转换(如cast()函数). 示例

web.config connectionStrings 数据库连接字符串的解释(转载)

先来看一下默认的连接SQL Server数据库配置<connectionStrings>   <add name="LocalSqlServer" connectionString="Data Source=.\SQLExpress;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="

面试之C语言字符串操作总结大全(转载)

趁着十一就好好补补数据结构吧,通信这个不软不硬的专业,现在还是得好好学学补习补习,,你这个非211的本科生!虽然拿到了一个offer,但是觉得时间还有,得继续拼一拼,希望不辜负! 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符