前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java StringBuilder和StringBuffer理解

Java StringBuilder和StringBuffer理解

作者头像
Tim在路上
发布2020-08-05 00:16:35
4470
发布2020-08-05 00:16:35
举报

首先,由于String是final类,所以其一旦赋值是不可修改的,同时其自带方法,类似与substring,replace,等,都是对原String拷贝后的再修改,所以String的使用不是很方便,也会很费存储空间和效率。

所以,StringBuffer是一个具有对象引用传递特点的字符串对象。可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。

Java String 理解

最后可以通过toString()方法再将操作的结果存入Stirng

StringBuilder和StringBuffer

StringBuilder是线程不安全的,而StringBuffer是线程安全的。StringBuilder是比较快的。

  • 相同点

他们都是继承抽象类AbstractStringBuilder实现的。

代码语言:javascript
复制
char[] value;
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
    value = new char[capacity];

用一个char[]数组保存字符串,可以在构造的时候指定初始容量方法。

扩容机制

他们的扩容机制是一样的。

代码语言:javascript
复制
public void ensureCapacity(int minimumCapacity) {
    if (minimumCapacity > 0)
        ensureCapacityInternal(minimumCapacity);
}
 private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0)
        expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
    int newCapacity = value.length * 2 + 2;
    if (newCapacity - minimumCapacity < 0)
        newCapacity = minimumCapacity;
    if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
            throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    value = Arrays.copyOf(value, newCapacity);
}

扩容是由expandCapacity()实现的,StringBuilder和StringBuffer的大部分方法均调用父类AbstractStringBuilder的实现。其扩容机制首先是把容量变为原来容量的2倍加2。最大容量是Integer.MAX_VALUE,也就是0x7fffffff。

StringBuilder和StringBuffer的默认容量都是16,最好预先估计好字符串的大小避免扩容带来的时间消耗。

  • 不同点

StringBuffer为了实现同步,很多方法使用lSynchronized修饰

源码如下

代码语言:javascript
复制
public synchronized int length() {
        return count;
}
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
public synchronized void setLength(int newLength) {
    toStringCache = null;
    super.setLength(newLength);
}

创建与方法

两者用法是一样的

StringBuffer/StringBuilder

  • 构造方法
    • StringBuffer() 初始容量为 16 个字符,字符缓冲区
    • StringBuffer(String str) 内容初始化为指定的字符串内容
  • 方法
    • StringBuffer append(char[] str) 追加到此序列,可以追加各种格式
    • char charAt(int index) 返回索引处的字符
    • StringBuffer delete(int start,int end) 删除从start到end的字符串
    • getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 得到字符数组
    • StringBuffer insert(int offset,X x) 将x插入次序列
    • int length() 返回长度
    • StringBuffer replace(int start,int end,String str) 替代序列
    • String substring(int start,int end) 返回字序列
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • StringBuilder和StringBuffer
  • 扩容机制
  • 创建与方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档