java基础知识2--String,StringBufffer,StringBuilder的区别

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)

  • 若是要操做少许的数据用 = String
  • 单线程操做字符串缓冲区 下操做大量数据 = StringBuilder
  • 多线程操做字符串缓冲区 下操做大量数据 = StringBuffer

4.下面是StringBuilder 经常使用的方法

StringBuilder append(参数)--将追加内容到当前StringBuilder对象的末尾;

StringBuilder insert(位置,参数)--将内容插入到StringBuilder对象的指定位置; str.insert(4, "!");  //在第5个位置插入 !

StringBuilder delete(初始位置,结束位置) --删除偏移的字符串

String toString()--将SringBuilder 对象转换为String对象;

int length()--获取字符串的长度;

 

就酱紫。

相关文章
相关标签/搜索