stringbuilder大小(stringbuilder size)
java StringBuilder 指定大小了 为什么能超出?
StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。这也就是为什么说stringbuilder定义后 “可以改变,且线程不安全”
StringBuilder初始化大小时指定大小和不指定大小有什么区别?
指定了大小后,在运行效率上会高很多,这个是一个方面。另外一个方面,当你调用Win32的DLL时,如果接口方法的参数中有字符串的输出(LPSTR),就应该使用StringBuilder这个类型,此时,定义的StringBuilder变量就必须指定大小(为变量初始化内存空间),否则,当DLL内部对变量空间赋值的时候会失败,甚至出现意外,因为外部DLL并不支持StringBuilder这样的数据操作行为。
C#——string与StringBuilder
本来说好的,有socket的记录的,但是基础知识还没整理完,所以就先不写,等基础知识梳理完毕再进行记录。
那么今天就先记录一下关于string字符串类,还有就是StringBuilder类,它们俩的区别的联系。
OK,那么我们开始进入正题。
首先,我来记录一下,关于string类型的一些琐碎知识:
这个时候输出的就是True和False了。
暂时就想到了那么多,然后呢关于正则表达式,待会也会记录一下。
下面记录一下关于string类型的一些属性方法。
字符串是String类型的对象,它的值是文本。在内部,文本被存储为Char对象的顺序只读集合。C# 字符串末尾没有以 null 结尾的字符;因此 C# 字符串可以包含任意数目的嵌入式 null 字符(“\0”)。字符串的Length属性代表了其所包含的Char字符的数量,而不是Unicode字符数量。
若要访问字符串中的各个 Unicode 码位,请使用 StringInfo 对象。
关于string类型的构造函数:
也就是说,我们可以使用new运算创建string对象,
比如:char[] array = {'a','b','c'};string a = new string(array);
但是,注意,除了在使用字符数组初始化字符串时以外,不要使用 new 运算符创建字符串对象。
下面记录,一些关于string类型的静态方法,这里只记录一部分,像是什么重载之类的方法就不一一介绍了。
关于字符串比较:
当然,它还有一些方法重载,这里就不记录了。
比较两个字符串,如果strA“小于”strB 那么返回-1,如果strA“等于”strB 那么返回0,如果strA“大于”strB 那么返回1。
如果 true 的值与 a 的值相同,则为 b;否则为 false。 如果 a 和 b 均为 null,此方法将返回 true。
关于字符串连接:
返回一个字符串,是方法参数按照顺序连接在一起。
连接指定的string数组的元素,注意关键字 params 表示参数数组没有固定的大小。
关于字符串Copy:
创建一个与指定的 System.String 具有相同值的 System.String 的新实例。
关于检索:
检索系统对指定 System.String 的引用。如果暂存了 str,则返回系统对其的引用;否则返回对值为 str 的字符串的新引用。
关于判断null:
指示指定的字符串是 null 还是 System.String.Empty 字符串。如何是空字符串或者null,那么返回true,否则返回false。
关于插入字符:
关于格式化:
将指定字符串中的一个或多个格式项替换为指定对象的字符串表示形式。
静态方法就是那么多,然后就是一些实例方法了。
返回对此string实例的引用。
与strB进行比较,如果小于0,则比strB小,如果等于0,则与strB相等,如果大于0,则比strB大。
如果value包含在该实例字符串中,则返回true,否则返回false。
将指定数目的字符从此实例中的指定位置复制到 Unicode 字符数组中的指定位置。
第一个参数: 要复制的此实例中第一个字符的索引。
第二个参数:此实例中的字符所复制到的 Unicode 字符数组。
第三个参数: destination 中的索引,在此处开始复制操作。
第四个参数:此实例中要复制到 destination 的字符数。
报告指定字符串在此实例中的第一个匹配项的从零开始的索引。 搜索从指定字符位置开始,并检查指定数量的字符位置。如果找到该字符串,则为从当前实例的起始位置开始的从零开始的 value 的索引位置;否则为 -1。 如果 value 为 System.String.Empty,则返回值为startIndex。
将value插入到指定的位置index。
返回当前实例中从指定位置到最后位置的所有以删除的字符的新字符串。
返回指定数量字符在当前这个实例起始点在已删除的指定的位置的新字符串。
返回一个新字符串,其中此实例中出现的所有指定 Unicode 字符都替换为另一个指定的 Unicode 字符。
返回一个新字符串,其中当前实例中出现的所有指定字符串都替换为另一个指定的字符串。######public String[] Split(char[] separator, int count);
基于数组中的字符将一个字符串拆分成最大数量的子字符串。 也可指定要返回的子字符串的最大数量。注意返回的是数组。
从此实例检索子字符串。 子字符串在指定的字符位置开始并一直到该字符串的末尾。
从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
返回此字符串转换为小写形式的副本。
返回此字符串转换为大写形式的副本。
比较常用和重要的就是这些了。
下面讲一下关于StringBuilder的知识点。
首先,StringBuilder的功能其实和string类型很像,可是为什么会有两个功能相近的东西出现呢?这不是很脑残的事件么?
还记得string的最重要的一个特性吧,那就是不变性!!!
由于string类型的不变性,如果我们反复修改字符串,那么就可能会造成性能上的损失,这个时候,我们可是使用StringBuilder类型。
StringBuilder类型是一个可变字符串类,可变性意味着,一旦创建类的实例后,可以修改通过追加、 删除、 替换或插入字符。
一个 StringBuilder 对象会维护一个缓冲区来容纳扩展到字符串。
如果没有可用空间,将新数据追加到缓冲区否则为系统会分配新的、 更大的缓冲区、 从原始缓冲区的数据复制到新的缓冲区和新的数据则追加到新的缓冲区。
比如,我们在创建一个StringBuilder类型的实例的时候给它20大小的空间,如果20不够,那么它就会自动的增加到40,也就是2倍,但是不会创建新的实例,也就没有了频繁GC,所以性能损耗就会减少。
但是,StringBuilder并非万能的,当遇到如下情况的时候,可以使用string类型:
当你遇到如下情况时,可以考虑使用StringBuilder:
OK,下面就在记录一些关于StringBuilder类型的属性和方法:
传送门:
向实例追加指定的字符串。
向此实例追加指定子字符串的副本。
向此实例追加通过处理复合格式字符串(包含零个或更多格式项)而返回的字符串。 每个格式项都替换为一个参数的字符串表示形式。
将后面跟有默认行终止符的指定字符串的副本追加到当前 System.Text.StringBuilder 对象的末尾。
将默认的行终止符追加到当前 System.Text.StringBuilder 对象的末尾。
从当前 System.Text.StringBuilder 实例中移除所有字符。
将此实例的指定段中的字符复制到目标 System.Char 数组的指定段中。
将指定字符串的一个或更多副本插入到此实例中的指定字符位置。
将字符串插入到此实例中的指定字符位置。
将指定范围的字符从此实例中移除。
OK,最后再给一个StringBuilder的例子,就此完结。
java中StringBuilder的长度问题
StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
注意,是16字节的字符缓冲区,不是长度,length是取出字符串的长度,创建该对象时,没有字符串,自然长度就是0了
C#基础string和StringBuilder
string 和 StringBuilder 的区别: tring 不可变, StringBuilder 是可变的
当 StringBuilder 字符大小达到限制就会去申请新的内存区域,大小是原来的2倍
1、利用构造函数创造StringBuilder
System.Text.StringBuilder sb = new System.Text.StringBuilder("HelloWord");
2、初始化一个空的StringBuilder,大小为20
StringBuilder sb = new StringBuilder(20);
3、初始化了一个对象,初始化的对象是HelloWord,这个对象有20字符大小
StringBuilder sb =new StringBuilder("HelloWord",20);
StringBuilder 追加字符串
4、当我们需要对一个字符串进行频繁的删除和添加,使用StringBuilder的效率会高于string
sb.Append("HaoShuai");
sb.Insert(0, "http://");
字符串
1、字符串的不可变性:当你重新给一个字符串赋值之后,老值并无销毁,会重新开辟一块新的内存储存。
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁
2、我们可以将字符串看做是char类型的一个只读数组
ToCharArray(); 将字符串转换成Char数组
new string(char[] chs) :能够将char数组转换成字符串
字符串提供的各种方法
1、 Length 获取字符串的长度个数。
2、 ToUpper(); 将字符串转换成大写形式
3、 ToLower(); 将字符串转换成小写形式
4、 Equals(比较的字符串,StringComparison。OrdinalIgnoreCase); 比较两个字符串,忽略大小写
5、 Split(); 分割字符串,返回字符串数组
CompareTo : 比较字符串 返回值int -1,0,1
//CompareTo:字符串比较
string s = "jiangxinbin";
//当两个字符串相等的时候,返回0 如果当比较 j 时,就在字母表靠前返回1,靠后返回-1
int res = s.CompareTo("jiangxinbin");
Replace :把指定字符替换指定自定义字符 不影响原字符 字符换字符 字符串换字符串
string newSTr= s.Replace('.', '-');
string newSTr= s.Replace(“.”,“----”);
Split: 在出现给定字符的地方,把字符串拆分成一个字符串数组
string[] strArray = s.Split('.');
Substring : 截取指定字符串位置后面的长度的字符串
string str = s.Substring(6);
ToLower : 把字符串转换成小写形式
ToUpper: 把字符串转换成大写形式
Trim: 删除收尾的空白
Concat: 合并字符串
CopyTo: 把字符串中指定的字符复制到一个数组中
Format: 格式化字符串
indexOf 取得字符串第一次出现某个给定字符串或者字符的位置
ndexOfAny
insert: 把一个字符串实例插入到另一个字符串实例的制定索引处
Join: 合并字符串数组,创建一个新的字符串
string 是 System.String 的别名
// string 和 StringBuilder 的区别: string 不可变, StringBuilder 是可变的
// 当 StringBuilder 字符大小达到限制就会去申请新的内存区域,大小是原来的2倍
// 1、利用构造函数创造 StringBuilder
//System.Text.StringBuilder sb = new System.Text.StringBuilder("JiangXinBIn");
// 2、初始化一个空的 StringBuilder ,大小为20
//StringBuilder sb = new StringBuilder(20);
// 3、初始化了一个对象,初始化的对象是JiangXinBin,这个对象有20字符大小
StringBuilder sb =new StringBuilder("JaingXinBin",20);
StringBuilder:
Append() 方法,给当前字符串追加字符
insert() 追加特定格式的字符串
Remove() 从当前字符串中删除字符
Replace() 在当前字符串中,用某个字符或者字符串全部替换另一个字符或字符串
ToSting() 吧当前的 StringBuilder 中存储的字符串,提取成一个不可变得字符串