string stringbuffer stringbuilder 区别

基本概念

String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全)

执行速度

StringBuilder>StringBuffer>String

String类型和StringBuffer类型的主要性能区别在于String是不可变的对象,因此每次对String类型进行改变的时候其实等统一生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最后不要String,因为每次生成对象都会对系统性能产生影响,内存中无引用多了后,还会进行GC,速度就相当慢了。

StringBuffer结果就不同了,StringBuffer每次都是对对象本身进行操作的,所以一般情况下推荐使用StringBuffer.

某些特殊情况下,String的字符串拼接被JVM解释成了StringBuffer对象的拼接,所以这些时候String对象的速度并不会比StringBuffer慢。

1
2
3
4
5
6
7
8
9
10
String S1 = “This is only a” + “ simple” + “ test”;
在JVM中,S1被解释成
String S1 = “This is only a simple test”; //所以快。
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
---------------------------------
String str2 = “This is only a”;
String str3 = “ simple”;
String str4 = “ test”;
String str1 = str2 +str3 + str4;
//这时候JVM会规规矩矩的按照原来的方式去做。

线程安全性

StringBuilder:线程非安全的

StringBuffer:线程安全的

  当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

StringBuffer常用API

1
2
3
4
5
6
7
8
9
10
11
public StringBuffer append(char c)//
public StringBuffer append(String str)/
public StringBuffer append(StringBuffer sb)// append 添加任意类型。
public int IndexOf(String str)// 查找指定字符串是否存在
public int IndexOf(String str,int fromIndex) //从指定位置查找字符串
public StringBuffer indsert(int offset,String str)//指定位置插入字符串
public int reverse() //翻转
public StringBuffer replace(int start,int end,String str)//指定内容替换
public int length() //长度
public StringBuffer delete(int start,int end)// 删除指定范围字符串
public StringBuffer substring(int start,int end)//截取指定范围