StringBuffer

java.lang.StringBuffer 类是字符串线程安全可变序列。以下是关于StringBuffer的要点:

  • StringBuffer像是一个字符串,和 String 类不同的是,StringBuffer类 (StringBuilder 类也一样)的对象能够被多次的修改,并且不产生新的未使用对象,在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer
  • 它包含某些特定的字符序列,但该序列的长度和内容可以通过某些方法调用来改变。
  • 线程安全的多线程应用。
    • 使用synchronized 关键字来通过线程同步来实现线程安全,因此也相对较慢
  • 每个字符串有缓冲区容量
  • 在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer

使用教程

初始化/构造方法

  • StringBuffer() 构造一个16个字符长度的字符串缓冲区,源码见构造方法1
StringBuffer sb = new StringBuffer();
  • StringBuffer(String str) 指定字符串内容的字符串缓冲区对象,源码见构造方法2
    • 字符串缓冲区长度为str.length() + 16
StringBuffer sb = new StringBuffer("abc");
  • StringBuffer(int capacity) 指定初始容量的字符串缓冲区,源码见构造方法3
StringBuffer sb = new StringBuffer(16);
  • StringBuffer(CharSequence cSeq)
CharSequence cSeq = "online";
StringBuffer buffer = new StringBuffer(cSeq);

  • public StringBuffer append(String s)
    • 该方法更新对象的值。该方法采用:boolean,char,int,long,String,字符集合等类型。
StringBuffer buff = new StringBuffer("tuts ");
System.out.println("buffer = " + buff);

// appends the boolean argument as string to the string buffer
buff.append(true);
// print the string buffer after appending
System.out.println("After append = " + buff);

buff = new StringBuffer("abcd ");
System.out.println("buffer = " + buff);
// appends the boolean argument as string to the string buffer
buff.append(false);
// print the string buffer after appending
System.out.println("After append = " + buff);

// char array
char[] str = new char[]{'p','o','i','n','t'};
buff = new StringBuffer("tuts ");
buff.append(str);
System.out.println("buffer = " + buff);

输出:

buffer = tuts 
After append = tuts true

buffer = abcd
After append = abcd false

buffer = tuts point

buffer = amrood
After append = amrood admin
  • StringBuffer append(char[] str, int offset, int len)
public static void main(String[] args) {

StringBuffer buff = new StringBuffer("amrood ");
System.out.println("buffer = " + buff);

// char array
char[] str = new char[]
{'a','d','m','i','n','i','s','t','r','a','t','o','r'};

/* appends the string representation of char array argument to
this string buffer with offset at index 0 and length as 5 */
buff.append(str, 0, 5);

// print the string buffer after appending
System.out.println("After append = " + buff);
}

输出:

buffer = amrood
After append = amrood admin

  • StringBuffer delete(int start, int end)
    此方法删除这个序列中的一个子串的字符

  • int capacity()
    此方法返回当前容量

  • int length()
    此方法返回长度(字符数)

  • String toString()

    此方法返回表示此序列中数据的字符串

实现原理

构造方法1

/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}

构造方法2

/**
* Constructs a string buffer initialized to the contents of the
* specified string. The initial capacity of the string buffer is
* {@code 16} plus the length of the string argument.
*
* @param str the initial contents of the buffer.
*/
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}

构造方法3

/**
* Constructs a string buffer with no characters in it and
* the specified initial capacity.
*
* @param capacity the initial capacity.
* @exception NegativeArraySizeException if the {@code capacity}
* argument is less than {@code 0}.
*/
public StringBuffer(int capacity) {
super(capacity);
}

StringBuilder

StringBuilder和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

String类方法

  1. String concat(String str)
    此方法串连指定字符串到该字符串的结尾

    public class StringDemo {

    public static void main(String[] args) {

    // print str1
    String str1 = "self";
    System.out.println(str1);

    // print str2 concatenated with str1
    String str2 = str1.concat(" learning");
    System.out.println(str2);

    // prints str3 concatenated with str2(and str1)
    String str3 = str2.concat(" center");
    System.out.println(str3);
    }
    }

    Output:

    self
    self learning
    self learning center
  2. boolean equals(Object anObject)
    此方法让该字符串与指定的对象进行比较

  3. static String format(String format, Object… args) 此方法返回使用指定格式字符串和参数的格式化字符串

  4. boolean isEmpty()
    此方法返回true,当且仅当length()为0

  5. int length()
    这个方法返回这个字符串的长度

  6. String replace(char oldChar, char newChar)
    此方法返回通过用newChar更换所有oldChar出现在此字符串,产生一个新的字符串

  7. [String] split(String regex)
    这种分割方法根据给定的正则表达式匹配这个字符串

    public class StringDemo {

    public static void main(String[] args) {

    String str = "a d, m, i.n";
    String delimiters = "\s+|,\s*|\.\s*";

    // analyzing the string
    String[] tokensVal = str.split(delimiters);

    // prints the number of tokens
    System.out.println("Count of tokens = " + tokensVal.length);

    for(String token : tokensVal) {
    System.out.print(token);
    }
    }
    }

    output:

    Count of tokens = 5
    admin
  8. char[] toCharArray()此方法这个字符串到一个新的字符数组转换

  9. String toLowerCase()
    此方法将所有在此字符串中的字符使用默认语言环境的规则为小写

  10. String toUpperCase()
    此方法使用默认语言环境的规则将这个字符串所有的字转为大写

  11. sb.toString() StringBuffer和StringBuilder对象转String字符串对象

  12. char charAt(int index)
    此方法返回指定索引处的char值。

    反转指定长度的字符串

    class Solution {
    public String reverseLeftWords(String s, int n) {
    StringBuilder sb = new StringBuilder();
    for(int i = n; i < s.length(); i++){
    sb.append(s.charAt(i));
    }
    for(int i = 0; i < n; i++){
    sb.append(s.charAt(i));
    }
    return sb.toString();
    }
    }