上一文中,我们说了char,char是单个字符,如”A”、”B”、”C”….
那么字符串就是把字符串起来,如”ABC”、”Tony”、”Kevin”…
String、StringBuffer、StringBuffer都可以表示字符串,而他们的区别如下:
1、String是常量, StringBuffer、StringBuilder是变量。
2、运行速度上:StringBuilder >StringBuffer > String
3、线程安全方面StringBuilder是线程不安全的,而StringBuffer是线程安全的
下面解释造成以上区别的原因是:
因为String是常量,在创建之后就不可以再改;StringBuffer、StringBuilder是变量,可以更改,String在字符串发生如下变化的时候:
String str = “Tony”;
str = str + ”Kevin”;
这时str为“Tony Kevin”,似乎是发生了变化,实际因为String为常量的原因,在第二行的时候,系统又创建了一个名叫str的对象,并赋予旧str的值+”Kevin”,然后旧str就被系统回收。
而StringBuffer、StringBuilder是变量,不存在String的那套过程,可以直接改变。所以在运行速度上,StringBuffer、StringBuilder会相对来说比String快的原因。
StringBuffer、StringBuilder之间的快慢比较就跟线程有关系了,因为StringBuffer、StringBuilder是基本一样的,唯一区别是StringBuffer带有synchronized,而StringBuilder不带synchronized,所以StringBuilder在多线程下,不能保证线程的安全,有可能会出现错误。(简单形容一下,synchronized相当于锁,在多线程下,当有线程在占用某个资源的时候,synchronized就会把资源锁住,从而避免了多个线程访问冲突,但是缺点就是降低了运行速率,详细可以百度百科:synchronized)
所以运行速度StringBuilder> StringBuffer,线程安全方面StringBuilder是线程不安全的,而StringBuffer是线程安全的。
也许会有疑问,对比了String和StringBuffer,String似乎完全没有优势,为什么不全用StringBuffer代替String;因为 String是常量,不需要锁,多线程也可以在不冲突的情况下使用而且共享一个字符串,而且String复制时,在常量池(存储)指向同一个实例,节省了空间。
使用情况说明:
String:无、少量字符串操作情况
StringBuilder:单线程下大量字符串操作的情况
StringBuffer:多线程下大量字符串操作的情况
使用操作说明:
初始化:StringBuilder和StringBuffer都应该使用构造函数来初始化。
StringBuilder构造函数:
StringBuilder():构造一个具有初始容量16的实例。(如果超过容量时,会自动翻倍)
StringBuilder(intcapacity):构造一个指定容量大小为capacity的实例。
StringBuilder(CharSequenceseq):构造一个内容为seq字符的实例
StringBuilder(Stringstr):构造一个内容为str的实例
StringBuffer的构造函数和StringBuilder一样如下:
StringBuffer()
StringBuffer(intcapacity)
StringBuffer(Stringstring)
StringBuffer(CharSequencecs)
在上文介绍到,StringBuilder(API文档:StringBuilder)和StringBuffer(API文档:StringBuffer)是变量,那么自然的就可以动态的对此类的值(字符串)进行操作,主要的操作如下。
增加字符串方法:
StringBuilder和StringBuffer增加字符串都用到了append方法。append()方法中传入的参数类型可以是字符组数、double值、float值、String值、long值、char值、boolean值、int值、StringBuffer对象、CharSequence对象,如果这些参数本身不是字符或者字符串的值,那么参数就会被转换为字符串,然后增加在原有的字符串后面。
如:
StringBuffer MyStringBuffer = newStringBuffer("abc");
MyStringBuffer. append(true);
这时候,MyStringBuffer的值就是"abctrue"。
删除字符串方法
StringBuilder和StringBuffer的方法中用于删除字符串有两个,delete(int start, int end)和deleteCharAt(int location),deleteCharAt方法是只删除一个通过int参数指定位置(索引值)的字符,而delete方法是删除一段字符,从第一个int参数指定的位置(索引值)到第二个int参数指定的位置(索引值),这里需要注意的是,StringBuilder和StringBuffer对象的索引值是从0开始的,也就是如下代码所示:
MyStringBuffer. deleteCharAt(1);
这时候删除了索引值为1的字符,那么MyStringBuffer就会变成"actrue",接下来试试delete方法。
MyStringBuffer. delete (1,2);
那么,MyStringBuffer就会变成"arue"。
插入字符串方法
StringBuilder和StringBuffer的insert方法用于插入字符串操作,insert()方法中一般有两个参数,第一个参数是用来指定插入的位置,第二个参数是指定插入的数据,数据最终会如append方法那样以字符串的形式被插入到对象中。insert()方法中有两个是四个参数的,分别是insert(int index, char[] chars,int start, int length)和insert(int index, CharSequence s, int start, int end),作用是在对象指定的位置插入字符数组/队列的某段字符,第三和第四个参数共同来指定字符数组/队列的某段字符的位置。
------------------------------------------------分割线----------------------------------------------------------
上文如有错误、写得不合理以及有疑惑的地方,希望您可以在评论区提出。
在下十分感谢。
如果只是想在评论区吐吐槽、聊聊心得、卖个萌,同样也十分欢迎。
祝大家生活美好,干杯!~( ゜▽゜)つロ
转载请注明原作者以及附上原文章地址,谢谢。