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 类具有是不可变 ...
随机推荐
- springboot Service层单元测试
两个实现类实现同一个Service接口 public interface CustomUrlService { List<ShopMetrics> getShopMetrics(); } ...
- sudo之后出现“unable to resolve host ××××”
对主机IP反解即可 打开 /etc/hosts 文件, 在 127.0.0.1 localhost 那行的后面添加你自己的主机名就好啦
- 快速上手的Glide4.x教程
安卓基础开发库,让开发简单点. DevRing & Demo地址:https://github.com/LJYcoder/DevRing 学习/参考地址: https://blog.csdn. ...
- Rendering Problems The following classes could not be found:- android.support.v7.internal.app.WindowDecorActionBar (Fix Build Path, Create Class)
如图出现如下的错误的时候,一般都是升级Androdi Studio 后导致的,引入库不全,或者其他 东西缺少 可以如下解决方案:
- svnlook - Subversion 仓库检索工具
SYNOPSIS 总览 svnlook command /path/to/repos [options] [args] OVERVIEW 概述 Subversion 是一个版本控制系统,允许保存旧版本 ...
- spark on yarn提交任务时报ClosedChannelException解决方案
spark2.1出来了,想玩玩就搭了个原生的apache集群,但在standalone模式下没有任何问题,基于apache hadoop 2.7.3使用spark on yarn一直报这个错.(Jav ...
- Linux上的VirtualBox如何使用USB
问题: VirtualBox设置中已经启用了"USB2.0(EHCI)控制器"选项,但是虚拟机中始终没有USB设备,右下角的状态也显示没有连接任何USB设备,看起来像是Virtua ...
- hdu 2774 后缀数组
题目大意: 求两个字符串的最长公共子串 基本思路: 首先自然而然的想到应当把两个串拼接起来,为了便于处理,所以在串的中间加个大量(就是一个比其他值大的值),最后别忘了拼接上下标为n的时候是0,调用da ...
- vue 项目 多选 问题
近期 vue 项目用到多选功能,引用的elementUI的级联多选 Cascader,但是没有效果. 后来发现是elementUI版本问题,我们项目用的是2.7.2版本,版本太低. 后来 卸载了 重新 ...
- 自定义checkbox,radio样式
input[type=radio] { margin-right: 5px; cursor: pointer; font-size: 14px; width: 15px; height: 15px; ...