android基础-Java篇05:字符串 String、StringBuffer与StringBuffer

上一文中,我们说了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),作用是在对象指定的位置插入字符数组/队列的某段字符,第三和第四个参数共同来指定字符数组/队列的某段字符的位置。

------------------------------------------------分割线----------------------------------------------------------

上文如有错误、写得不合理以及有疑惑的地方,希望您可以在评论区提出。

在下十分感谢。

如果只是想在评论区吐吐槽、聊聊心得、卖个萌,同样也十分欢迎。

祝大家生活美好,干杯!~( ゜▽゜)つロ

 

转载请注明原作者以及附上原文章地址,谢谢。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值