String、StringBuffer和StringBuilder區別


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錯誤

轉載請於明顯處標明出處

https://www.cnblogs.com/AmyZheng/p/9415064.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM