String 不可变特性带来的劣势

String 是不可变的,这意味着如果我们需要不断对一个字符串进行修改,我们要么得将其转化成 char 数组,然后像 C 语言一样进行字符串操作;要么不断新建 String 对象进行拼接啥的(JVM 还要待会回收中间变量(对象)),特别消耗资源,而且慢的一,写起来还贼烦。

可变字符串:StringBuffer

StringBuffer 的实现原理好像和 Vector 差不多,申请一块空间,然后在这块空间内进行操作,如果不够了就再去申请一些。我不太想主修 Java,也没兴趣细究背后的原理,但总而言之,这种方法在频繁修改字符串方面,比对 String 增增补补有着相当大的性能优势。

长度,容量

  1. StringBuffer s = new StringBuffer("Hello, world!");
  2. System.out.println(s.length());//长度:13
  3. System.out.println(s.capacity());//容量:29(在我的电脑上面是这个数据)

长度 length() 就是字符串的长度,这个和 String 一致。
容量 capacity() 就是上面提到的空间大小,虽然我暂时每太搞得懂为啥这种理应封装起来的技术细节要专门写个方法来给我们读取(逃

StringBuffer 的修改操作

public class Main {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("Hello, world!");
        s.append("This is Java!");//追加内容
        s.delete(7, 13);//删除操作,好像也是左闭右开的
        s.insert(7, "world!");//插入操作
        s.reverse();//反转操作
        String ss = s.toString();//转为string
    }
}

StringBuffer 还有许多方法,限于本人水平,此处不再赘述,感兴趣可以自行查阅 API 文档。

可继承性

和 String 不同,StringBuffer 是可以继承的,我们可以以其为基础,写一个更为方便的自用类。

StringBuilder

StringBuilder 和 StringBuffer 都是为了字符串的频繁处理而出现的,它们共同继承于 AbstractStringBuilder 类。
两者在具体使用上面据我所知没啥大区别,他们具体的差异在于:

  1. 多线程:StringBuffer 是线程安全的,StringBuilder 则是线程不安全的
  2. 性能:StringBuilder 的速度要更快一些(在性能差异上,可以理解为 scanf 和 cin 的区别?(纯猜测,不负任何责任))