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 类具有是不可变 ...
随机推荐
- Win7下VS2008安装cocos2d-2.0-x-2.0.4模板时, 运行InstallWizardForVS2008.js文件执行失败的解决办法
今天在Win7环境下的VS2008中安装cocos2d-x模板的过程中,当点击InstallWizardForVS2008.js时,弹出" 没有文件扩展'.js'的脚本引擎&q ...
- yum安装LAMP
安装LAMP环境二进制包安装,先更新yum源,PHP 7.0.33 扩展可选 yum -y install mysql mysql-server mysql-devel httpd httpd-dev ...
- mysql中tinyint(1)与tinyint(2)的区别
tinyint 型的字段如果设置为UNSIGNED类型,只能存储从0到255的整数,不能用来储存负数.tinyint 型的字段如果不设置UNSIGNED类型,存储-128到127的整数. 1个tiny ...
- RedisTemplate序列号自增id(当前日期+序列号)
话不多上,直接上码 public class TestService { @Resource RedisTemplate<String, Object> redisTemplate; pu ...
- Zookeeper-技术专区-运作流程分析介绍
Zookeeper的启动流程 Zookeeper的主类是QuorumPeerMain,启动时读取zoo.cfg配置文件,如果没有配置server列表,则单机模式启动,否则按集群模式启动,这里只分析集群 ...
- 我学习的自定义ASP.NET分页控件
public class MyPagecontroll { public int TotalCount { get; set; }//数据的总条数 public int PageSize { get; ...
- js异步处理
一.什么是异步? 我们一般喜欢把异步和同步.并行拿出来比较,我以前的理解总是很模糊,总是生硬地记着“同步就是排队执行,异步就是一起执行”,现在一看,当初简直就是傻,所以我们第一步先把这三个概念搞清楚, ...
- 让所有Excel数据格全部乘 某个数
1 首先设置单元格格式要是数字 2 然后在随便一个单元格写入你要乘的数字 3 粘贴的时候设置选择性粘贴,然后设置乘就OK
- CICS FILE OPEN
CEMT I CECD V FILE() GROUP() CEDA check error log in JESYSMSG FILE OPEN/CLOSE STATUS CICS ACTION res ...
- tf.placeholde函数解释与用法
函数原型:tf.placeholder(dtype, shape=None, name=None) 使用说明:该函数用于得到传递进来的真实的训练样本.同时也可以理解为形参, 用于定义过程,在执行的时候 ...