008-Java的StringBuilder和StringBuffer

StringBuffer 和 StringBuilder

与String的不同
  • String Java中十分重要的类;被声明为final class。除了hash这个属性, 其他属性也均声明为final. 因此在涉及到字符串拼接时候, 会产生很多中介的字符串对象, 也因此如果有频繁的拼接行为, 则会导致较低的性能。
  • StringBuffer StringBuffer即是用于解决大量拼接字符串导致产生过多中间对象带来的性能较低的现象。StringBuffer的本质是一个线程安全的可修改的字符序列, 把所有修改数据的方法都加上了synchronized。可同时, 在保证线程安全的同时, 也是有性能牺牲的。
  • StringBuilder 于是乎, 不需要关注线程安全和无中间拼接对象的StringBuilder产生了。与StringBuffer没差,只是去掉了线程安全。
    因此, 当我们有多字字符串拼接行为, 尽量避免使用String更为合适。同时,尽量预估字符串大小,设置好capacity,避免扩容带来的额外开销(因为扩容会重新开辟空间进行数组的移植)。
    StringBuffer和StringBuilder都继承AbstractStringBuilder,底层均是利用可修改的char数组。

    String常量池

    String常量池是Java为了避免同样的字符串常量存在多分拷贝产生大量String对象所引入的。
    策略: (1)创建一个字符串时(String str = "aabbcc"), 首先检查常量池中是否有值相同的字符串对象, 如果有, 则不会再次创建,而是直接将引用传递; 如果没有, 则在常量池中创建响应的字符串, 然后将引用传递。(2)但是当使用new String("aabbcc")进行字符串创建时, 则不会检查常量池是否存在此字符串常量, 也不会在常量池创建, 而是直接在堆中创建相应的对象。

实例

(1)String str = "aa" + "bb" + "cc"
对于这种字符串的拼接, 编译阶段会直接合成"aabbcc", 然后去字符串常量池去对应。
(2)String str1 = str + "dd" + "ee" + "ff"
即使带了变量, 在拼接时也先创建StringBuilder,然后使用append方法向其中拼接。
上述两种方式, 在拼接操作并不很频繁的前提下, 使用string也是没有问题的
(3)对下述代码

    String s1 = "aa" + "bb" + "cc";
    String s2 = "dd" + "ee" + "ff";
    String s3 = new String("gg");
    String s4 = s1 + s2;

对上述部分, 则会多次new StringBuilder, 因此不如直接使用StringBuilder来的方便。

StringBuffer的常见使用方法

StringBuilder strb = new StringBuilder("aabbccdd");

  • strb.append("ee") 将指定字符追加到strb的末尾(结果:aabbccddee)
  • strb.reverse() 将字符序列反转(结果:eeddccbbaa)
  • strb.delete(1,5) 删除strb中位置1到位置5的子字符串。(包含1,但不包含5)(结果:)
  • strb.insert(1,"zzz"); 将zzz插入到strb的第二个位置处。(结果: czzzbbaa)
  • strb.replace(2, 5, "yyy"); 使用yyy替换位置2到位置5的字符串(包含1,但不包含5)(结果: czyyybaa)

转载于:https://www.cnblogs.com/Sinkinghost/p/11537376.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值