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 类具有是不可变 ...
随机推荐
- mybatis自学历程(二)
传递多个参数 1.在mybatis.xml下<mappers>下使用<package> <mappers> <package name="com.m ...
- Python面试题之下面代码会输出什么
def f(x,l=[]): for i in range(x): l.append(i*i) print l f(2) f(3,[3,2,1]) f(3) 答案: [0, 1] [3, 2, 1, ...
- MQ入门介绍
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传递指的是程序 ...
- pair queue____多源图广搜
.简介 class pair ,中文译为对组,可以将两个值视为一个单元.对于map和multimap,就是用pairs来管理value/key的成对元素.任何函数需要回传两个值,也需要pair. 该函 ...
- C#排序 转
本文链接:https://blog.csdn.net/fysuccess/article/details/36416255 C#中List<T>排序的两种方法 List<Studen ...
- redis相关笔记(一.安装及单机及哨兵使用)
redis笔记一 redis笔记二 redis笔记三 1.安装 cd /usr/src #进入下载目录(这个目录自己定) yum install -y wget gcc make tcl #安装依赖 ...
- 单调栈+线段树——cf1220F
首先考虑初始排列,pi会让周围所有比其大的元素深度+1,所以要求每个点的深度,只要其被覆盖了几次即可 这个覆盖可以通过处理每个元素的左右边界(单调栈O(n))+线段树区间更新(Ologn(n))来做 ...
- 构造——cf1202d
和以前有一题构造01串的很像,固定住一个7,求出3的个数,对1的位置进行贪心 /* 1337 1 13337 3 133337 6 1333337 10 */ #include<bits/std ...
- CTSC2019
(upd:随机立方体AC) 太菜了只会部分分.以后慢慢补坑吧…… 随机立方体: 30分: 正常人都能想到的的转移状态(我的确是弱智),从大往小填数,记录有多少个极大值点和三个方向上各占了多少.转移可以 ...
- hihoCoder [Offer收割]编程练习赛3 D子矩阵求和
子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...