相同点
- 都来自java.lang包,用来封装字符串;
- 都实现了java.io.Serializable,CharSequence接口。
- 都是final class不能被继承。
不同点
- String类是不可变的,每次对String对象进行修改都会创建一个新的String对象,因此在需要对字符串进行大量修改的场景下,使用String类会产生很多的开销。
- StringBuffer和StringBuilder类是可变的,可以对其进行修改,而不会创建新的对象。
- StringBuffer类是线程安全的,而StringBuilder类不是线程安全的。
- 在单线程环境下,StringBuilder类的性能比StringBuffer类更高。
- 执行速度由快到慢:StringBuilder > StringBuffer > String
1.String:
-
String 是由final 修饰的,一旦使用 final 修饰的类不能被继承、方法不能被重写、属性不能被修改。而且 String 不仅仅类是final 的,它其中的方法也是由 final 修饰的,换句话说,Sring 类就是一个典型的 Immutable 类。
-
由于String类是不可变的,因此在需要对字符串进行大量修改的场景下,使用String类会产生很多的开销,降低程序的性能。
2.StringBuffer
-
StringBuffer类和String类一样,也用于处理字符串。与String类不同的是,StringBuffer对象是可变的,可以对其进行修改,而不会创建新的对象。
-
StringBuffer类中提供了一些方法,用于对字符串进行修改。比如,append()方法用于在字符串末尾添加新的内容;insert()方法用于在指定位置插入新的内容;delete()方法用于删除指定位置的内容等。 一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
-
需要注意的是,由于StringBuffer对象是可变的,因此在多线程环境下使用StringBuffer类可能会出现线程安全问题。为了解决这个问题,Java提供了StringBuilder类。
3.StringBuilder
-
StringBuilder类和StringBuffer类非常类似,也是用于处理可变的字符串。与StringBuffer类不同的是,StringBuilder类的实现不是线程安全的,因此在单线程环境下,StringBuilder类的性能比StringBuffer类更高。
-
需要注意的是,由于StringBuilder对象不是线程安全的,因此在多线程环境下使用StringBuilder类可能会出现线程安全问题。因此,在多线程环境下,应该使用StringBuffer类。