04.字符串的不可变性

字符串

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



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

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

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

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

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

空间.



 (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);
  31. Console.ReadKey();
  32. }
  33. }
  34. }

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毫秒

来自为知笔记(Wiz)

时间: 2024-11-05 14:43:29

04.字符串的不可变性的相关文章

字符串-04. 字符串逆序

1 /* 2 * Main.c 3 * D4-字符串-04. 字符串逆序 4 * Created on: 2014年8月19日 5 * Author: Boomkeeper 6 *******测试通过****** 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 char str[80]; 14 15 gets(str); 16 17 int i; 18 for(i=0;i<80;i++){ 19 if(str[i]=='\0

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

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

字符串-04. 字符串逆序(15)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串. 输入格式: 输入在一行中给出一个不超过80个字符长度的.以回车结束的非空字符串. 输出格式: 在一行中输出逆序后的字符串. 输入样例: Hello World! 输出样例: !dlroW olleH import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scann

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

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

04. 字符串合并与拆分写法小结

原文:04. 字符串合并与拆分写法小结 一. 字符合并 if OBJECT_ID('ConcatStr') is not null drop table ConcatStr GO create table ConcatStr ( ID int, Code varchar(10) ) GO insert into ConcatStr select 1,'XXX' union all select 1,'YYY' union all select 2,'PPP' union all select 2

摘录-IT企业必读的200个.NET面试题-04 字符串、集合和流的使用

字符串处理 Q: System.String是值类型还是引用类型 System.String是引用类型,它的对象在初始化之后就不能再做修改,任何试图修改字符串对象的动作将导致一个新的字符串对象生成. Q: 如何在string和Byte[]对象之间进行转换 字符串和字节数组的转换依赖于编码方式的使用,不同的编码标准将使用不同的算法进行.System.Text.Encoding类型提供了大部分常见编码算法支持,用以进行字符串和字节数组之间的转换.下面是代码例子: class Program { st

Swift 学习- 04 -- 字符串和字符

// 字符串 和 字符 // 字符串 是有序的 Character (字符) 类型的值的集合,  通过 String 类型的集合 // swift 的 String 和 Character 类型提供了快速和兼容 Unicode 的方式供你的代码使用, 创建和操作字符串的语法与C语言中的字符串相似, 轻量并且已读 // 字符串连接操作只需要简单地通过 + 符号将两个字符串连接即可 // 与swift 中其他值一样, 能否更改字符串的值, 取决于其被定义为常量还是变量 // 注意: // swift

新手C#string类常用函数的学习2018.08.04

ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量. s = s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower(); 这可以使用户的输入不区分大小写,例如验证码. ToUpper()用于将字符串全部变为大写,与上面类似. Trim()可以用于去掉两边的空格. string s1 = " a b c "; s1 = s1.Trim();//用于去除字符串两边的空格 Console.WriteLine

C#基础------字符串函数

//String 常用函数 //1.Contains(是否包含XX字符串) //2.StartsWith(是否以XX开头) //3.EndsWith(是否以XX结尾) //4.IndexOf(获取某个字符在字符串中第一次出现的位置) //5.LastIndexOf(获取某个字符在字符串中最后一次出现的位置) //6.SubString(截取字符串) //7.ToLower(字符串变为大写) //8.ToUpper(字符串转大写) //9.Replace(替换字符串) //10.Trim(去掉首尾