不可变和可变字符串
不可变字符串
1、string,引用类型,string类型标识零或更多单字符组成的序列(集合)
2、string是.net Framework中String的别名
3、不可变字符串类似不可变数组
4、长度固定
5、字符串包含char类型元素,不可变数组根据定义数组的类型决定元素的元素
6、都是通过索引查看元素位置
7、不可变字符串内容不能修改
初始化字符串方式
方法一 字面量创建字符串
string str1="abc";
string str2=@"abc";
方式2 char数组类型
char[] charArray=new char[]{'a','b','c','d','e'};
string str3=new string(charArray);
方法3 string.Format("");
string str4=string.Format("123");
字符串本质也是单字符的数组
string str5="abcdefg";
Console.WriteLine(str5.Length);
char charNumber1 = str5[0];
Console.WriteLine(charNumber1);
//str5[0] = 'w'; 无法直接修改某个单字符
for (int i = 0; i < str5.Length; i++)
{
Console.WriteLine(str5[i]);
}
foreach (var item in str5)
{
Console.WriteLine(item);
}
在着里说一下 数组与集合的区别
| 维度 | 原生数组 | 集合框架 (如 ArrayList) |
|---|---|---|
| 长度 | 固定 (创建时定死,不能扩容) | 动态 (自动扩容,想装多少装多少) |
| 类型 | 可存基本数据类型 (int,double) | 通常只能存对象/包装类 (Integer,String) |
| 功能 | 简陋 (只有存取,需手动写循环) | 强大 (自带增删改查、排序、转字符串等方法) |
| 性能 | 极高 (内存连续,CPU 缓存友好) | 稍低 (有自动装箱、扩容复制等额外开销) |
| 底层 | 纯粹的连续内存 | 通常是动态数组 (ArrayList) 或 链表 (LinkedList) |
字符串的常用API表
| 功能分类 | 方法/属性 | 说明 |
|---|---|---|
| 获取信息 | .Length | 获取字符个数(属性,不是方法)。 |
.IndexOf(val) | 查找字符或子串第一次出现的位置,找不到返回 -1。支持指定起始位置和长度。 | |
.LastIndexOf(val) | 查找字符或子串最后一次出现的位置。 | |
| 判断检查 | .StartsWith(val) | 判断是否以某字符串开头。 |
.EndsWith(val) | 判断是否以某字符串结尾。 | |
.Contains(val) | 判断是否包含某子串。 | |
string.IsNullOrEmpty() | 静态方法,判断字符串是否为null或""。 | |
| 大小写 | .ToUpper()/.ToLower() | 转大写 / 转小写。 |
| 清理/填充 | .Trim() | 去除首尾空格(还有TrimStart,TrimEnd)。 |
.PadLeft()/.PadRight() | 用空格或指定字符填充以达到指定长度。 | |
| 截取/修改 | .Substring(start, len) | 截取子串。注意参数是(起始索引,长度)。 |
.Remove(start, len) | 删除指定位置的字符。 | |
.Insert(index, val) | 在指定位置插入字符串。 | |
.Replace(old, new) | 替换字符或子串。 | |
| 拆分/组合 | .Split(char) | 将字符串按分隔符拆分为字符串数组。 |
string.Join(sep, arr) | 静态方法,将数组元素用分隔符连接成新字符串。 | |
.ToCharArray() | 将字符串转为字符数组 (char[])。 |
格式化字符串
含义:用特殊的符号 是变量和数据 按指定格式拼接成字符串的形式
1、用{}来表示,在{}内填写所占的位的序号,从零开始
string name="可乐"; int age=3; Console.WriteLine("{0}今年{1}岁",age,name);2、格式化标识符
字母 含义 C或c Currency 货币格式 D或d Decimal 十进制格式(十进制整数,不要和。Net的Decimal数据类型混淆了) E或e Exponent 指数格式 F或f Fixed point 固定精度格式 G或g General 常用格式 N或n 用逗号分隔千位的数字,比如1234将会被变成1,234 P或p Percentage 百分符号格式 R或r Round-trip 圆整(只用于浮点数)保证一个数字被转化字符串以后可以再被转回成相同的数字 X或x Hex 16进制格式 时间格式化符号 d 天 M 月 y 年3、模板字符串$"{变量1}{变量2}"
string name="可乐" int age=3; Console.WriteLine($"{name}今年{age}岁"); string str=$"{age:d}今年{age:f}"可变字符串
string和StringBuilder区别:
1、String类型在C#中用于保存字符,为引用类型,一旦创建,就不能再进行修改,其底层是根据字符数组(char[])实现的
2、StringBuilder表示可变字符字符串类型,其中的字符可以被改变、增加、删除、当向一个已满的StringBuilder添加字符时,其会自动申请内存进行扩展
使用场景:
对字符串添加或删除操作不频繁的话,就几个固定的string累加的时候就不需要StringBuilder了
StringBuilder的初始化也是需要时间的,对字符串添加或删除操作比较频繁的话那就用StringBuilder。
特点:
1、可以定义可变字符串,实现字符串的添加
2、对于高频率字符串拼接可以使用
3、如果普通拼接 可以使用字符串格式化方式
//1、创建可变字符串 StringBuilder sb = new StringBuilder(); //追加字符 sb.Append("hello world"); sb.Append("asd"); //占位符 //追加字符串平且格式化 sb.AppendFormat("{0}{1}", 123, 456); //在指定位置插入字符串 //参数1:插入位置索引值 //参数2:插入的字符串 sb.Insert(14, "你好"); //参数3:插入字符串重复的次数 sb.Insert(14, "你好", 2); Console.WriteLine(sb); //移除字符串 //参数1:开始位置的索引值 //参数2:移除的长度 sb.Remove(0, 6); Console.WriteLine(sb); //替换字符串 //参数1:要替换的字符串 //参数2:替换的字符串 sb.Replace("d", "中"); Console.WriteLine(sb); //转换为不可变字符串 string strTest=sb.ToString(); //查看某个字符 Console.WriteLine(sb[4]); Console.WriteLine("____________修改长度之前"); for(int i = 0; i < sb.Length; i++) { Console.WriteLine(sb[i]); } //可变 字符串的长度 Console.WriteLine(sb.Length); //可变字符串的长度可以被修改 sb.Length = 10; Console.WriteLine("_____________修改之后"); for (int i = 0; i < sb.Length; i++) { Console.WriteLine(sb[i]); } //foreach 无法遍历可变字符串 //foreach(char item in sb) //{ // Console.WriteLine(item); //} //创建代码检测时间的对象 Stopwatch sw = Stopwatch.StartNew(); //开始检测时间 StringBuilder sb1=new StringBuilder(); sb1.Insert(0, "abc", 10000); Console.WriteLine(sb1); Console.WriteLine(sb1.Length); sw.Stop(); //输出代码执行的时间 以毫秒为单位 Console.WriteLine("不可变字符串拼接时间:{0}毫秒",sw.ElapsedMilliseconds); Console.WriteLine();