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)

008-Java的StringBuilder和StringBuffer的更多相关文章

  1. 全面解释java中StringBuilder、StringBuffer、String类之间的关系

    StringBuilder.StringBuffer.String类之间的关系 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,在上一篇博文中我 ...

  2. java中StringBuilder、StringBuffer、String类之间的关系

    今天在CSDN的高校俱乐部里看到了"Java基础水平測试(英文)".感觉自己学了java这么久,想看下自己的java水平究竟是个什么样.測试结果就不说了,反正是慘不忍睹. 看了一下 ...

  3. java String,StringBuilder和StringBuffer

    String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...

  4. 用大白话的方式讲明白Java的StringBuilder、StringBuffer的扩容机制

    StringBuffer和StringBuilder,它们的底层char数组value默认的初始化容量是16,扩容只需要修改底层的char数组,两者的扩容最终都会调用到AbstractStringBu ...

  5. StringBuilder和StringBuffer的区别

    Java中StringBuilder和StringBuffer的区别分析 StringBUilder是线程不安全的(线程同步访问的时候会出问题),但是效率相对较高. (String类型使用加号进行拼接 ...

  6. 探秘Java中的String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...

  7. java中String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  8. JAVA基础学习day13--String、StringBuilder与StringBuffer与包装类

    一.String 1.1.String String 类是final修饰的,是顶级类,不可被继承 String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" ) ...

  9. Java基础-String、StringBuffer、StringBuilder

    看下面这段代码: public class Main { public static void main(String[] args) { String string = ""; ...

  10. Java基础(32):String与StringBuilder、StringBuffer的区别(String类)

    在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...

随机推荐

  1. jdk紧急漏洞,XMLDecoder反序列化攻击

    昨天在公司发现了一个jdk中的XMLDecoder反序列化的漏洞,看起来很危险!下面通过两个示例来看看这个漏洞的危害! 示例1:利用XmlDecoder删除本地文件 首先来看这个xmldecoder. ...

  2. pip安装Scrapy因网络问题出错备选方案

    一 更改pypi默认源 执行 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 执行pip instal ...

  3. go之linux安装

    下载地址:https://golang.org/dl/ ubuntu16.04安装过程 官方安装文档:https://golang.org/doc/install?download=go1.11.4. ...

  4. Vue开发环境安装并集成element-ui示例

    此文为转载,原文链接:https://blog.csdn.net/weixin_44670973/article/details/88871106 在此对原文中部分内容进行补充. 补充:element ...

  5. Transformer 学习

    https://www.bilibili.com/video/av65521101/?p=98 (李宏毅,视频讲解,可以作为基础入门) 课件:https://pan.baidu.com/s/1Shjn ...

  6. 从零开始搭建系统2.8——HDFS安装及配置

    从零开始搭建系统2.8——HDFS安装及配置

  7. kubernetes报错

    错误信息:执行yaml文件后,服务在运行,但是提示命令找不到 原因:没有环境,相当于只有一个快捷方式 环境目录为/usr/local/bin 解决办法:将/etc/ansible/bin下的文件都拷贝 ...

  8. QList和QVector等容器的区别:(转)

    源地址:https://blog.csdn.net/qq_33266987/article/details/53333373 Qlist.QVector 与 list.vector似乎不太类似: li ...

  9. date -d 对于时间的控制

    [root@ ~]# date "+%Y"2019[root@ ~]# date "+%Y%m%d"20190826 [root@localhost ~]# d ...

  10. 深入理解Magento – 第十章、十一章(英文原版地址,仅供参考)

    深入理解Magento – 第十章 – Magento系统覆盖和升级 http://alanstorm.com/magento_upgrade_rewrite_override 深入理解MAGENTO ...