首页 > 其他分享 >StringBuffer和StringBuilder

StringBuffer和StringBuilder

时间:2024-07-14 12:19:12浏览次数:13  
标签:return String StringBuffer value str StringBuilder public

public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence {

    public StringBuffer() {
        super(16);
    }
    
    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }

    public synchronized String toString() {
        return new String(value, 0, count);
    }

    // 其他方法
}
public final class StringBuilder extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
    // ...

    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }

    // ...
}
  • StringBuffer 操作字符串的方法加了 synchronized 关键字进行了同步,主要是考虑到多线程环境下的安全问题,所以如果在非多线程环境下,执行效率就会比较低

  • StringBuilder 除了类名不同,方法没有加 synchronized,基本上完全一样

  • StringBuilder的toString()

// 使用 value 数组中从 0 开始的前 count 个元素创建一个新的字符串对象,并将其返回
public String toString() {
    return new String(value, 0, count);
}
  • StringBuilder的append()
public StringBuilder append(String str) {
    // 调用 AbstractStringBuilder 中的 append(String str) 方法
    super.append(str);
    return this;
}
public AbstractStringBuilder append(String str) {
    if (str == null)
        // 当做字符串“null”来处理
        return appendNull();
    int len = str.length();
    // 判断扩容
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}

private void ensureCapacityInternal(int minimumCapacity) {
    if (minimumCapacity - value.length > 0)
        // 扩容
        expandCapacity(minimumCapacity);
}

void expandCapacity(int minimumCapacity) {
    // 新容量为旧容量的两倍加上 2
    int newCapacity = value.length * 2 + 2;
    // 如果新容量小于指定的最小容量,则新容量为指定的最小容量
    if (newCapacity - minimumCapacity < 0)
        newCapacity = minimumCapacity;
    // 如果新容量小于 0,则新容量为 Integer.MAX_VALUE
    if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
            throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    // 将字符序列的容量扩容到新容量的大小
    value = Arrays.copyOf(value, newCapacity);
}
  • StringBuilder的reverse()
public StringBuilder reverse() {
    // 调用了父类 AbstractStringBuilder 中的 reverse() 方法
    super.reverse();
    return this;
}
public AbstractStringBuilder reverse() {
    boolean hasSurrogates = false;
    // 字符序列的最后一个字符的索引
    int n = count - 1;
    // 遍历字符串的前半部分
    for (int j = (n-1) >> 1; j >= 0; j--) {
        // 计算相对于 j 对称的字符的索引
        int k = n - j;
        // 获取当前位置的字符
        char cj = value[j];
        // 获取对称位置的字符
        char ck = value[k];
        // 交换字符
        value[j] = ck;
        value[k] = cj;
        if (Character.isSurrogate(cj) ||
            Character.isSurrogate(ck)) {
            hasSurrogates = true;
        }
    }
    if (hasSurrogates) {
        reverseAllValidSurrogatePairs();
    }
    return this;
}

标签:return,String,StringBuffer,value,str,StringBuilder,public
From: https://www.cnblogs.com/sprinining/p/18301348

相关文章

  • Arrays,Object,String,StringBuffer和常用工具类汇总
    Arrays[数组操作方法:排序,查找,替换,转换,复制]排序将数组升序排序:Arrays.sort(数组);查找数组中想查找的数字的索引:Arrays.binarysearch(数组,想查找的数字(例如3));替换将数组中的元素全部用x替换:Arrays.fill(数组,x);Arrays.fill(数组,下标y,下标z,x);//y-z下标的元素替换为x......
  • JAVA 中的 StringBuilder 和 StringBuffer 适用的场景是什么?
    转自菜鸟教程的一位大哥-------未之奋豆未之奋豆429***[email protected]参考地址6年前(2018-05-07)JAVA中的StringBuilder和StringBuffer适用的场景是什么?最简单的回答是,stringbuffer基本没有适用场景,你应该在所有的情况下选择使用stringbuiler,除非你真的遇到了一个需要线......
  • 深入理解Java中的StringBuffer与StringBuilder:性能、用法与代码样例
    在Java编程中,当我们需要频繁地修改字符串时,使用String类可能会遇到性能问题,因为String是不可变的(immutable)。为了解决这个问题,Java提供了两个可变字符串类:StringBuffer和StringBuilder。这两个类都允许我们在不创建新对象的情况下修改字符串,但它们之间也有一些重要的区别。......
  • Java基础——数组应用之StringBuilder类和StringBuffer类
    系列文章目录文章目录系列文章目录前言一、StringBuffer类二、StringBuffer概述三、StringBuffer方法四、StringBuilder类五、String、StringBuffer、StringBuilder的区别前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点......
  • String、StringBuilder和StringBuffer是处理字符串的三个不同的类
    在Java中,String、StringBuilder和StringBuffer是处理字符串的三个不同的类,它们各自具有不同的特点和使用场景。下面将具体分析这三个类的异同点:不可变性与可变性String:String是一个不可变的字符串,这意味着一旦一个String对象被创建,其值就不能改变。这种设计提供了值的恒定性,使......
  • c#中String和StringBuilder两个对象用户写入文件:导出操作
    在C#中,有两个主要用于字符串操作的类:String和StringBuilder。String:String类表示一个不可变的字符串。这意味着一旦创建了一个字符串对象,它的内容就不能被修改。每次对字符串进行操作(比如连接、替换、删除等),都会创建一个新的字符串对象。这可能会导致性能开销,尤其是在需要......
  • StringBuffer和StringBuilder方法
    StringBuffer:可变长字符串,jdk1.0提供,运行效率满、线程安全。StringBuilder:可变长字符串,jdk5.0提供,运行效率快、线程不安全。(单线程推荐使用)效率:StringBuilder>StringBuffer>String//验证StringBuilder效率高于StringpublicclassString{publicstaticvoidmain(java.lang.......
  • Java面向对象-常用类(String 、StringBuffer 、StringBuilder的使用与深入)
    常用类-字符串相关类1什么是StringString是不可变类,即一旦一个String对象被创建,包含在这个对象中的字符序列是不可改变的,直至该对象被销毁。String类是final类,不能有子类。2分类StringStringBufferStringBuilder3String的使用packagecom.qf.string_c......
  • String、StringBuffer、StringBuilder的区别
    在Java中,`String`、`StringBuffer`、和`StringBuilder`都是用于处理字符串的类,但它们之间存在一些关键差异,主要涉及可变性、线程安全性和性能:1.String:-不可变性:`String`对象一旦被创建,其内容就不能改变。任何对`String`的操作,比如拼接、替换等,都会返回一个新的`String`对象,而原......
  • String、StringBuffer、StringBuilder的区别
    在Java中,`String`、`StringBuffer`、和`StringBuilder`都是用于处理字符串的类,但它们之间存在一些关键差异,主要涉及可变性、线程安全性和性能:1.String:-不可变性:`String`对象一旦被创建,其内容就不能改变。任何对`String`的操作,比如拼接、替换等,都会返回一个新的`String`对象,而原......