String 字符串常量 StringBuffer 字符串變量(線程安全) StringBuilder 字符串變量(非線程安全)
String 類代表字符串。java 程序中的所有字符串字面值(如 “abc” )都是String類的對象。字符串是常量;它們的值在創(chuàng)建之后不能改變。所以可以共享它們。
StringBuffer是字符串緩存區(qū),它的內(nèi)容可以被修改,長度也可以改變,StringBuffer類是線程安全的,也就是說多個線程可以安全的訪問StringBuffer對象。
StringBuilder與StringBuffer類似,都是字符串緩java中String、StringBuffer、StringBuilder是編程中經(jīng)常使用的字符串類,他們之間的區(qū)別也是經(jīng)常在面試中會問到的問題。現(xiàn)在總結(jié)一下,看看他們的不同與相同。
1.可變與不可變 String類中使用字符數(shù)組保存字符串,如下就是,因為有“final”修飾符,所以可以知道string對象是不可變的。 PRivate final char value[]; String 為不可變對象,一旦被創(chuàng)建,就不能修改它的值. . 對于已經(jīng)存在的String對象的修改都是重新創(chuàng)建一個新的對象,然后把新的值保存進(jìn)去. StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串,如下就是,可知這兩種對象都是可變的。 char[] value; StringBuffer:是一個可變對象,當(dāng)對他進(jìn)行修改的時候不會像String那樣重新建立對象 , 它只能通過構(gòu)造函數(shù)來建立, 如: StringBuffer sb = new StringBuffer(); 不能通過賦值符號對他進(jìn)行付值. , 如 sb = “welcome to here!”;//error 對象被建立以后,在內(nèi)存中就會分配內(nèi)存空間,并初始保存一個null.向StringBuffer中賦值的時候可以通過它的append方法. sb.append(“hello”);
2.是否多線程安全 String中的對象是不可變的,也就可以理解為常量, 顯然線程安全 。 AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。 StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是 線程安全的 。看如下源碼:
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并沒有對方法進(jìn)行加同步鎖,所以是 非線程安全的 。
3.StringBuilder與StringBuffer共同點 StringBuilder與StringBuffer有公共父類AbstractStringBuilder( 抽象類 )。 抽象類與接口的其中一個區(qū)別是:抽象類中可以定義一些子類的公共方法,子類只需要增加新的功能,不需要重復(fù)寫已經(jīng)存在的方法;而接口中只是對方法的申明和常量的定義。 StringBuilder、StringBuffer的方法都會調(diào)用AbstractStringBuilder中的公共方法,如super.append(…)。只是StringBuffer會在方法上加synchronized關(guān)鍵字,進(jìn)行同步。 最后,如果程序不是多線程的,那么使用StringBuilder效率高于StringBuffer。
效率比較 String < StringBuffer < StringBuilder,
但是在String S1 =“This is only a”+“simple”+“test”時,String效率最高。沖區(qū),但StringBuilder不是線程安全的,如果你只是在單線程中使用字符串緩沖區(qū),那么StringBuilder的效率會更高些。值得注意的是StringBuilder是在JDK1.5版本中增加的。以前版本的JDK不能使用該類。
新聞熱點
疑難解答