当前位置: 首页 > news >正文

不可变和可变字符串

不可变字符串

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();
StringBuilder的精髓:原地修改索引访问以及长度控制。它是处理动态文本构建(如生成 SQL 语句、XML/JSON 组装、日志记录)的必备工具。
http://www.cnnetsun.cn/news/2159803.html

相关文章:

  • 走向Agent-Native!360AI知识库打通业务底座,让人与AI自然协同
  • 星途电讯 | 小米17T曝光:天玑8500+徕卡,提前杀到 游戏交易懂游宝平台化:信任与效率的重塑
  • 别让电源毁了你的项目!给Arduino供电的5个实战避坑指南(从USB到电池)
  • Windows安卓应用一键安装:告别模拟器的高效解决方案
  • Windows Terminal美化避坑指南:手把手解决Oh-My-Posh字体乱码、主题不生效问题
  • 3分钟快速上手:Windows电脑安装安卓应用的终极解决方案
  • Spring Boot 完整流程
  • 终极跨平台键鼠共享指南:如何用Lan Mouse一套设备控制多台电脑?
  • 基础知识回顾
  • 客厅落地窗双层窗帘搭配方案实用款
  • 别再手动改注册表了!用Python的winreg模块批量修改软件配置(附实战代码)
  • 如何在Windows上直接安装APK文件:告别模拟器的终极轻量级解决方案
  • MIKE IO完整指南:5分钟掌握Python水文数据处理利器
  • KISSABC伴学 英语沉浸式伴学优势深度解析
  • Vue-Excel-Editor深度解析:重新定义Web表格编辑的技术范式
  • 如何替换SQL字符串字符_利用REPLACE函数进行批量清洗
  • uConsole模块化手持计算机:硬件解析与使用指南
  • 智能抠图助手有哪些?2026年最全工具测评与推荐指南
  • 避坑指南:用DRV8833和STM32驱动直流电机,这些PWM配置细节千万别搞错
  • NoFences终极指南:免费开源工具彻底解决Windows桌面混乱问题
  • Unity C#入门:脚本的生命周期函数详解(LateUpdate/OnDestroy)
  • 3步拯救你的B站缓存视频:从m4s格式到永久MP4备份的完整解决方案
  • Swoole HTTP Server 的本质的庖丁解牛
  • 如何用KeymouseGo快速实现鼠标键盘自动化?完整免费教程
  • AriaNg:如何为命令行下载工具打造现代化的Web控制界面?
  • 如何彻底解除Navicat试用期限制:macOS智能重置方案完整指南
  • R 4.5地理空间分析增强(仅限2024年6月前安装的用户可解锁的隐藏空间IO加速模式)
  • 游戏PBR材质自动生成:从低分辨率截图到次世代渲染
  • AOSP 本质解析:为什么 Android 是编译期 + 运行时的混合系统(系统篇)
  • 如何快速掌握B站视频下载:DownKyi完整配置使用指南