写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。

这博客是对自己学习的一点点总结及记录,如果您对 Java算法 感兴趣,可以关注我的动态,我们一起学习。

用知识改变命运,让我们的家人过上更好的生活

相关文章 String 的常用方法

一、 StringBuffer

1.分析 StringBuffer 的底层源码

 public final class StringBuffer
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
    private transient char[] toStringCache;

    static final long serialVersionUID = 3388685877147921107L;

    /**
     * 构造一个没有字符的字符串缓冲区,初始容量为16个字符
     */
    public StringBuffer() {
        super(16);
    }

    /**
     * 构造一个字符串缓冲区,该缓冲区中没有字符,且具有指定的初始容量
     */
    public StringBuffer(int capacity) {
        super(capacity);
    }

    /**
     * 构造一个初始化为指定字符串内容的字符串缓冲区。字符串缓冲区的初始容        
     * 量是{@code 16}加上字符串参数的长度。
     */
    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }

它是JDK1.0引进来的,它继承于AbstractStringBuilder
再看看它的父类AbstractStringBuilder的源码:

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * value 用于存储字符
     */
    char[] value;

    /**
     * 计数是使用的有效字符数
     */
    int count;

value : 用于存储字符,可以看到value没有用final修饰,表明它可以进行不断地扩容;
int count :计数是使用的有效字符数

2. StringBuffer 详述

StringBuffer 线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。

在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。
如果内部缓冲区溢出,则会自动变大。除非另有说明,否则将null参数传递给null中的构造函数或方法将导致抛出NullPointerException 。

从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程StringBuilder 。 StringBuilder应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步。

3.StringBuffer 的构造方法

StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer(CharSequence seq) 构造一个包含与指定的相同字符的字符串缓冲区 CharSequence 。
StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。

4. StringBuffer 的常用方法

  • int length() 返回长度(字符数)
  • char charAt(int index) 返回 char在指定索引在这个序列值
  • int indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引
  • String substring(int start) 返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。
  • StringBuffer append(xxx) 提供了很多的append()方法,用于进行字符串拼接
  • StringBuffer delete(int start, int end) 删除此序列的子字符串中的字符
  • StringBuffer replace(int start, int end, String str) 用指定的String中的字符替换此序列的子字符串中的 String
  • StringBuffer insert(int offset, xxx) 在指定位置插入xxx
  • StringBuffer reverse() 把当前字符序列逆转

测试代码:

public class StringBufferMethodTest {

    public static void main(String[] args) {
        StringBuffer s1 = new StringBuffer("abc");

        // int length() 返回长度(字符数)
        System.out.println(s1.length()); // 3

        // char charAt(int index) 返回 char 在指定索引在这个序列值
        System.out.println(s1.charAt(0)); // a

        // setCharAt 修改指定位置的值
        s1.setCharAt(0, 'f');
        System.out.println(s1); // fbc

        //  int indexOf(String str)  返回指定子字符串第一次出现的字符串内的索引
        System.out.println(s1.indexOf("a")); // -1  表明没有找到,因为在上面的操作中把改成了b

        //  String substring(int start) 截取子串
        System.out.println(s1.substring(1)); // bc
        System.out.println(s1);

        // StringBuffer append(char c) 将 char参数的字符串表示附加到此序列
        System.out.println(s1.append("de")); // fbcde

        // StringBuffer delete(int start, int end) 删除此序列的子字符串中的字符
        System.out.println(s1.delete(0, 2)); // cde

        // StringBuffer replace(int start, int end, String str)
        // 用指定的String中的字符替换此序列的子字符串中的 String
        System.out.println(s1.replace(1, 3, "xy")); // cxy

        //  StringBuffer insert(int offset, char c) 在此序列中插入 char参数的字符串表示形式。
        System.out.println(s1.insert(1, "de")); // cdexy

        // StringBuffer reverse() 反转字符串
        System.out.println(s1.reverse()); // yxedc

        System.out.println("**************************");

        // 遍历字符串中的字符
        for (int i = 0; i < s1.length(); i++) {
            char c = s1.charAt(i);
            System.out.println(c);
        }

    }
}

测试结果:

3
a
fbc
-1
bc
fbc
fbcde
cde
cxy
cdexy
yxedc
**************************
y
x
e
d
c

二、StringBuilder

从版本JDK 5开始,这个类别已经被一个等级类补充了,这个类被设计为使用一个线程StringBuilder 。 StringBuilder应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步。

StringBuilder的常用方法与StringBuffer的相同,这里不再详述。

三、两者 与 String 的区别

String 由final修饰,是不可变字符序列
StringBuffer 可变字符序列,其效率低,但是线程安全
StringBuilder 可变字符序列,其效率高,但是线程不安全

在实际开发中,如果不考虑线程安全的为题,为了挺高效率,通常使用StringBuilder

上一篇 聊聊 String 的常用方法

下一篇 Java里面的排序、比较器(Comparable和Comparator)


本文转载:CSDN博客