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)
008-Java的StringBuilder和StringBuffer的更多相关文章
- 全面解释java中StringBuilder、StringBuffer、String类之间的关系
StringBuilder.StringBuffer.String类之间的关系 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,在上一篇博文中我 ...
- java中StringBuilder、StringBuffer、String类之间的关系
今天在CSDN的高校俱乐部里看到了"Java基础水平測试(英文)".感觉自己学了java这么久,想看下自己的java水平究竟是个什么样.測试结果就不说了,反正是慘不忍睹. 看了一下 ...
- java String,StringBuilder和StringBuffer
String:1.java语言中的字符串值属于String类,虽然有其它方法表示字符串(如字符数组),但java一般使用Sting类作为字符串的标准格式,java编译器把字符串值作为String对象. ...
- 用大白话的方式讲明白Java的StringBuilder、StringBuffer的扩容机制
StringBuffer和StringBuilder,它们的底层char数组value默认的初始化容量是16,扩容只需要修改底层的char数组,两者的扩容最终都会调用到AbstractStringBu ...
- StringBuilder和StringBuffer的区别
Java中StringBuilder和StringBuffer的区别分析 StringBUilder是线程不安全的(线程同步访问的时候会出问题),但是效率相对较高. (String类型使用加号进行拼接 ...
- 探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- java中String、StringBuffer、StringBuilder的区别
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- JAVA基础学习day13--String、StringBuilder与StringBuffer与包装类
一.String 1.1.String String 类是final修饰的,是顶级类,不可被继承 String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" ) ...
- Java基础-String、StringBuffer、StringBuilder
看下面这段代码: public class Main { public static void main(String[] args) { String string = ""; ...
- Java基础(32):String与StringBuilder、StringBuffer的区别(String类)
在Java中,除了可以使用 String 类来存储字符串,还可以使用 StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...
随机推荐
- leetcode.数组.769最多能完成排序的块-Java
1. 具体题目 数组arr是[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序.之后再连接起来,使得连接的结果和按升序排序后的原数 ...
- [POI2010]OWC-Sheep
题目 不难猜到或者发现的性质,如果连了一条对角线划分出了奇数个点,那么这条对角线肯定不合法:因为划分成三角形就不可能有对角线相交,于是划分成奇数的那一边怎么样也不可能划分成全是偶数 于是我们需要对每一 ...
- tomcat+nginx 单机部署多应用LINUX
1.首先虚拟机上安装nginx 和tomcat,这里安装就不赘述了. nginx安装可以参考https://www.linuxidc.com/Linux/2016-09/134907.htm,相关配置 ...
- Maven入门指南12:将项目发布到私服
1 . 修改私服中仓库的部署策略 Release版本的项目应该发布到Releases仓库中,对应的,Snapshot版本应该发布到Snapshots仓库中.Maven根据pom.xml文件中版本号&l ...
- 7G
- echarts 给formatter文字添加不同颜色
legend: { x : 'center', y : 'bottom', icon: "circle", itemWidth: 8, // 设置宽度 itemHeight: 8, ...
- myeclipse 报错:Set project compiler compliance settings to '1.5'
myeclipse 报错:Set project compiler compliance settings to '1.5' 解决方法:项目右击-->properties-->java c ...
- ORA-01400: cannot insert NULL into
Error text: ORA-01400: cannot insert NULL into when insert into view, NULL value handler in trigger. ...
- redis底层相关命令(一)
说明 用于分析redis底层数据结构以及内存情况 底层数据结构分析 1.查看key键的对象类型type key 本地:>sadd test1 本地:>type test1 set 2.查看 ...
- app混合开发 fastlick.js 在ios上 input标签点击 不灵敏 处理
ios11 上有这个问题 而老版本的ios没有 会出现这个的原因是使用fastclick.js点击后input没有获取焦点,所以只需要在fasyclick的源码的这个位置 可以直接在源码内搜索关键字找 ...