String、StringBuffer和StringBuilder區別
1、長度是否可變
- String 是被 final 修飾的,他的長度是不可變的,就算調用 String 的concat 方法,那也是把字符串拼接起來並重新創建一個對象,把拼接后的 String 的值賦給新創建的對象
- StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象,StringBuffer 與 StringBuilder 中的方法和功能完全是等價的。調用StringBuffer 的 append 方法,來改變 StringBuffer 的長度,並且,相比較於 StringBuffer,String 一旦發生長度變化,是非常耗費內存的!
2、執行效率
- 三者在執行速度方面的比較:StringBuilder > StringBuffer > String
3、應用場景
- 如果要操作少量的數據用 = String
- 單線程操作字符串緩沖區 下操作大量數據 = StringBuilder
- 多線程操作字符串緩沖區 下操作大量數據 = StringBuffer
StringBuffer和StringBuilder區別
1、是否線程安全
- StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是線程安全的(不能同步訪問),StringBuffer是線程安全的。只是StringBuffer 中的方法大都采用了 synchronized 關鍵字進行修飾,因此是線程安全的,而 StringBuilder 沒有這個修飾,可以被認為是線程不安全的。
2、應用場景
- 由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。
- 然而在應用程序要求線程安全的情況下,則必須使用 StringBuffer 類。 append方法與直接使用+串聯相比,減少常量池的浪費。
字符串聯的方式
1、測試案例:
package ecut.strings; /** * 當 字符串 變量 參與 串聯 操作時 * 是通過 StringBuilder ( 或 StringBuffer ) 類及其 append 方法實現的 */ public class StringTest5 { public static void main(String[] args) { String a = "abc" ; String b = "xyz"; String d = "abcxyz" ; // 兩個字符串字面值 通過 + 串聯,直接在 池中完成 String c = "abc" + "xyz" ; // + 是 "串聯" 作用 System.out.println( c == d ); System.out.println( "~~~~~~~~~~~~~~" ); // 字符串串聯是通過 StringBuilder ( 或 StringBuffer ) 類及其 append 方法實現的 // 1、StringBuilder sb = new StringBuilder( a ); // 2、sb.append( b ) ; // 3、sb.toString() ---> new String( chars ) String e = a + b ; System.out.println( e == c ); System.out.println( e == d ); String f = e.intern(); System.out.println( f == d ); //JAVA編譯器對string + 基本類型/常量 是當成常量表達式直接求值來優化的。 運行期的兩個string相加,會產生新的對象的,存儲在堆(heap)中 String g = a + "xyz" ;//a為變量,在運行期才會被解析。 System.out.println( g == c ); final String h = "abc" ; String i = h + "xyz" ; System.out.println( i == c );//h為常量,編譯期會被優化 } }
運行結果如下:
true
~~~~~~~~~~~~~~
false false true false true
兩個字符串字面值 通過 + 串聯,直接在 池中完成,例如String c = "abc" + "xyz" ; + 是 "串聯" 作用。兩個string對象用+,是在編譯器被優化為StringBuild再進行append()。
牛客網筆試題
1、應用程序的main方法中有以下語句,則輸出的結果( )
String s1=new String( ” xyz ” ); String s2=new String( ” xyz ” ); Boolean b1=s1.equals(s2); Boolean b2=(s1==s2); System .out.print(b1+ ” ” +b2);
正確答案: A
A、true false
B、false true
C、true true
D、false false
解析:
- 所有的 "" 包起來的 字符串字面值一律放在字符串常量池中,去字符串常量池池尋找相同內容的字符串。
- 如果存在就直接拿出來應用,如果不存在則創建一個新的字符串放在常量池中通過 new關鍵字創建 String 對象,每次調用都會創建一個新的對象。
- == 判斷兩個對象是否指向同一個引用,比較的是堆內存中的地址;而equals出了比較地址還比較“內容”是否一致。
2、下面程序的運行結果是
String str1 = "hello"; String str2 = "he" + new String("llo"); System.err.println(str1 == str2);
正確答案: B
A、 true
B、false
C、exception
D、無輸出
3、java中,StringBuilder和StringBuffer的區別,下面說法錯誤的是?
正確答案: C
A、StringBuffer是線程安全的
B、StringBuilder是非線程安全的
C、StringBuffer對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然后將指針指向新的 String 對象。
D、效率比較String<StringBuffer<StringBuilder,但是在 String S1 = “This is only a” + “ simple” + “ test”時,String效率最高。
解析:
- String拼接會創建一個新的String對象,存儲拼接后的字符串;StringBuffer拼接是直接在本身拼接,會即時刷新。
- String只能拼接String類型的字符串;StringBuffer能夠拼接所有的類型的值。
4、執行如下代碼段后,變量s1引用的字符串值是( )。
String s1 = "ABCD"; String s2 = "1234"; System.out.println(s1 + s2);
正確答案: A
A、ABCD
B、1234
C、ABCD1234
D、1234ABCD
5、不考慮反射,String類型變量所指向內存空間中的內容是不能被改變的 。 ( )
正確答案: A
A、正確
B、錯誤
解析:
- String類不可變,指的是String對象內容不可變,因為'String對象存在常量池中,而String的引用是可以可變,可以為String引用賦予新的對象字符串。
6、String與StringBuffer的區別。
正確答案: A B
A、String是不可變的對象,StringBuffer是可以再編輯的
B、字符串是常量,StringBuffer是變量
C、String是可變的對象,StringBuffer是不可以再編輯的
D、以上說法都不正確
7、StringBuffer類對象創建之后可以再修改和變動.
正確答案: A
A正確
B錯誤
轉載請於明顯處標明出處

