string转stringbuilder,字符转string
String,StringBuffer,StringBuilder内存分析
底层实际上是将循环体内的 string += CONSTANT_STRING; 语句转成了:
string = (new StringBuilder(String.valueOf(string))).append("min-snail").toString();
所以在二十万次的串联字符串中, 每一次都先去创建 StringBuilder 对象, 然后再调 append() 方法来完成 String 类的 "+" 操作。
这里的大部分时间都花在了对象的创建上, 而且每个创建出来的对象的生命都不能长久, 朝生夕灭, 因为这些对象创建出来之后没有引用变量来引用它们,
那么它们在使用完成时候就处于一种不可到达状态, java 虚拟机的垃圾回收器(GC)就会不定期的来回收这些垃圾对象。因此会看到上图堆内存中的曲线起伏变化很大。
但如果是遇到如下情况:
java 对 concat1 的处理速度也是快的惊人。耗时基本上都是 0 毫秒。这是因为 concat1 在编译期就可以被确定是一个字符常量。
当编译完成之后 concat1 的值其实就是 "lianjiaok", 因此, 在运行期间自然就不需要花费太多的时间来处理 concat1 了。如果是站在这个角度来看, 使用StringBuilder 完全不占优势, 在这种情况下, 如果是使用 StringBuilder 反而会使得程序运行需要耗费更多的时间。
但是 concat2 不一样, 由于 concat2 在编译期间不能够被确定, 因此, 在运行期间 JVM 会按老一套的做法, 将其转换成使用 StringBuilder 来实现。
从表格数据可以看出, StringBuilder 与 StringBuffer 在耗时上并不相差多少, 只是 StringBuilder 稍微快一些, 但是 StringBuilder 是冒着多线程不安全的潜在风险。这也是 StringBuilder 为赚取表格数据中的 1.7 毫秒( 若按表格的数据来算, 性能已经提升 20% 多 )所需要付出的代价。
综合来说:
StringBuilder 是 java 为 StringBuffer 提供的一个等价类, 但不保证同步。在不涉及多线程的操作情况下可以简易的替换 StringBuffer 来提升系统性能; StringBuffer 在性能上稍略StringBuilder, 但可以不用考虑线程安全问题; String 的 "+" 符号操作起来简单方便,String 的使用也很简单便捷, java 底层会转换成 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的例子,就此完结。
String 和StringBuilder的区别以及相互转换
StringBuffer与StringBuilder的区别主要是前者是线程安全的,就是说它是同步的;后者不安全,不是同步的,其它的区别不大。当你的程序不需要线程同步,一般都用StringBuilder.StringBuilder(以下简称sb)与String(以下简称str)的区别是:举个例子吧:Strings=newString(“woshizifuchuan”);当你要改变s的时候,比如改为s=s+”dsdsdsd”;系统会重新创建一个字符串变量它的值为”woshizifuchuandsdsdsd”,然后把该字符串赋值给s.当你这样的改变s的行为在一个循环里面,那么将会创建大量的中间变量,影响程序的运行效率:如:for(inti=0;i100000;i++){s=”a”;}StringBuildersb=newStringBuilder();一次性给sb分配一个固定长度大小的内存空间,当你改变的时候会在此空间后面加上,不够的时候,内存空间自动增加.比如初始分配的内存大小为10字节,那么.Sb.append(“as”);它占据内存空间10字节,此时sb.toString().equals(“as”)为true;Sb.append.(“qqq”),它占据的内存空间还是10字节,sb.toString().equals(“asqqq”)为true.当内存空间不够的时候,自动加长,加入一次增加10字节,那么:Sb.append(“ppppppp”),它占据的内存空间为20字节.StringBuilder允许设定它的初始长度和每次增加的长度。综合来说:当你大量更一个字符串的时候,String消耗的内存空间小,但是执行效率低。