StringBuffer和StringBuilder

  • 所属的包:java.lang.
  • 继承AbstractStringBuilder,默认Object
  • 实现了三个接口。
    • Serializable, Appendable, CharSequence
    • String类的接口不太一样。
    • 它们两个没有compareTo方法。但是不同的接口就是Appendable。含有一个String没有的方法。将给定的字符串追加字符串后面。

出现StringBufferStringBuilder的原因:

  1. String的内部实现是private final char[] value;具有不可变特性。
  2. 频繁的修改其内容的时候,性能很不好。
  3. 这两个类,频繁的改变字符串,性能比String类方法的操作字符串的性能好。
  • 特性:
    • 可变字符串。可变指的长度可变,内容也可变。
    • char[] value;数组的地址可以发生变化。产生新的数组。
  • 构建:

    • 有参数的构造方法。
      1. // 无参数的构造方法,构建一个默认长度16个空间的对象,char []
      2. StringBuilder sb = new StringBuilder();
      3. // 利用给定的参数,自定义一个长度空间的对象 char[]
      4. StringBuilder sb1 = new StringBuilder(10);
      5. StringBuilder sb2 = new StringBuilder("abc");
      通常使用String就可以了。
      我们在频繁的拼接字符串的时候,使用这两个。

      StringBuffer和StringBuilder常用方法

  • 最主要的方法:StringBuilder = append();提供了很多的重载。

    • StringBuilder是并发访问,速度更快。
    • StringBuffer就是线程安全的问题。
  • ensureCapacity(int minimumCapacity)确保底层数组容量够用。
  • int = capacity();返回StringBuilder的容量。容量并不是有效元素的数量。因为,扩容的时候,一般不会是一个一个扩容。会一次性扩容很多。防止频繁扩容。
  • int = length(); 有效元素的长度。跟我们封装的ArrayBox非常的类似。
  • char = charAr(int index); int = charPointAt(index);
  • String = subString(int start [,int end]);源StringBuilder没有发生变化。返回截取需要的String。
  • StringBuilder = delete(int start ,int end); 删除返回自己类型,说明本身自己也发生了变化。
  • StringBuilder = deleteCharAt(int index); 删除某一个index的字符。
  • StringBuilder = setCharAt(int index, char ch);将某个位置的char改掉。
  • indexOf(String str[, int fromIndex]);
    • lastIndexOf(String str[,int fromIndex]);是否存在。顺序不一样。
  • StringBuilder = insert(int offset, boolean b);往某一个位置插入一个东西。
  • replace(int start, int end, String str); 将某个区间的内容替换。
  • StringBuilder = reverse(); 反转字符串。
  • void = setLength(int newLength);Sets the length of the character sequence.手动设置字符串的有效长度。不太安全了。那么length的长度就不可信了。
  • String = toString();将我们StringBuilder对象构建成String

    1. public String toString() {
    2. // Create a copy, don't share the array
    3. return new String(value, 0, count);
    4. }
  • void = trimToSize();Attempts to reduce storage used for the character sequence将数组中无用的容量去掉,就变成length长度的数据。capacity==length;

总结:

  1. StringBuilder类不一定需要,是为了避免String频繁拼接修改字符串信息时候才用的。底层数组是可变的,提高了心梗。
  2. 常用方法
    1. 与String类不同的独有方法
    2. append,insert,delete,delteCharAt,reverse
  3. 与String类相同的方法
    1. charAr,codePointAt,indexOf,lastIndexOf,replace(名字相同,用法不同),length,subString
    2. 不是很常用的方法。capacity,setLength,ensureCapacity,trimToSize,setCharAt。
  4. 在笔试中,经常容易考察的知识点。
    1. String所属的包,继承关系,实现接口
    2. String的构建方式。常量,构造方法。
    3. String对象的内存结构。常量存在字符串常量中。new 存在堆内存。
    4. == 和equals区别。拼接
    5. String不可变特性。
    6. String 的常用方法。concat,—-与StringBuilder的区别。
    7. String和StringBuilder区别。或者String和StringBuffer的区别。
      1. String是不可变字符串。
        1. Comparable接口。
        2. 不可变体现在长度和内容。
        3. 有一些方法,另一个没有concat,compareTo,toUpperCase。
      2. StringBuilder或者StringBuffer是可变字符串。
        1. Appendable接口独有
        2. 可变的字符串。没有final修饰,底层可以进行数组的扩容。
        3. 有些方法String 没有。append,insert,delete,reverse。
  5. StringBuffer和StringBuilder不同
    1. buffer很早jdk 1.0,早期版本,builder很晚 jdk1.5之,更新版本。方法使用几乎一致。
    2. 通常的早期版本都是线程同步的(同一个时间只有一个线程操作)。安全性高,执行的效率相对较低。通常后期的版本,线程非同步的,安全性比较低,执行效率比较高。带了synchronized 修饰符。保证线程同步。

1:20: