String,StringBufffer,StringBuilder的区别数组
1.可变不可变方面安全
String类中使用字符数组保存字符串 ,final 修饰固然是不可变的,用String来操做字符串的时候,一旦咱们字符串的值改变,就会在内存建立多一个空间来保存新的字符串,即当用String操做字符串时,其实是在不断的建立新的对象,而原来的对象就会变为垃圾被GC回收掉,一旦遇到复杂的操做,String很是低效多线程
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,以下就是,可知这两种对象都是可变的。每当咱们用它们对字符串作操做时,其实是在一个对象上操做的。因此,通常涉及到字符串操做的,咱们通常使用StringBuffer或者StringBuilder app
char[] value;
2.线程安全方面:ui
String不可变,固然是安全的this
AbstractStringBuilder(抽象类)是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操做,如expandCapacity、append、insert、indexOf等公共方法。抽象类与接口的其中一个区别是:抽象类中能够定义一些子类的公共方法,子类只须要增长新的功能,不须要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。spa
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。线程
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,因此是线程安全的,经常使用于多线程安全。由于StringBuffer要维持同步锁,这确定要消耗部分资源,执行比StringBuilder慢。code
public synchronized StringBuffer reverse() { super.reverse(); return this; } public int indexOf(String str) { return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法 }
StringBuilder并无对方法进行加同步锁,因此是非线程安全的。可是若是是单线程,旧能够直接用StringBuilder。对象
3.使用场景(效率:StringBuilder>StringBuffer>String)
4.下面是StringBuilder 经常使用的方法
StringBuilder append(参数)--将追加内容到当前StringBuilder对象的末尾;
StringBuilder insert(位置,参数)--将内容插入到StringBuilder对象的指定位置; str.insert(4, "!"); //在第5个位置插入 !
StringBuilder delete(初始位置,结束位置) --删除偏移的字符串
String toString()--将SringBuilder 对象转换为String对象;
int length()--获取字符串的长度;
就酱紫。