Java面試題—字符串


  如果明天你要參加一場面試,面試官有個題目是:說說String/StringBuffer/StringBuilder它們之間的區別?你會怎么回答呢?(腦補一下答案)今天,小編就來和大家詳細聊聊字符串String/StringBuffer/StringBuilder,告訴你怎樣完美的回答以上面試官的問題,希望對你有幫助。

 


考點分析

這個題目也是考查字符串相關的。對於這個題目,我們通過閱讀源碼來驗證我們的答案。

 

上圖主要顯示String/StringBuilder/StringBuffer的UML結構。

 

 

 

為什么要引入其它兩種字符串處理類?

  說白了就是提高字符串連接效率。在大部分情況下,字符串的拼接速度為:StringBuilder>StringBuffer>String。

  String是不可變的,因此每次對其操作改變其變量值,其實是生成一個新的對象,然后將變量引用指向新對象;因此速度慢。

  StringBuffer則不同,對其操作即直接操作對象指向的引用,無需產生新對象,速度很快;它是線程安全的,在維護多線程的同步等也會消耗一點性能。

  StringBuilder是jdk5之后新增的,其用法與StringBuffer完全一致,但它是線程不安全的,在單線程中最佳,因為其不需要維護線程的安全,因此是最快的。

 

 

是否線程安全?

  String 字符串常量(線程安全)。StringBuffer 字符串變量(線程安全)。StringBuilder 字符串變量(非線程安全)。

  String 是不可變的,StringBuffer/StringBuilder 是可變的;String/StringBuffer是線程安全的,StringBuilder是非線程安全的。

 

這里引入來一個新的問題,了解String.intern()方法嗎?

 

  String.intern()查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等於str的字符串並返回它的引用。因此在用String進行字符串拼接時,會產生很多臨時變量。建議多使用StringBuffer/StringBuilder。

 

 

存放在什么地方?

 

  String是存放在常量池,在編譯期已經被確定了。new String()不是字符串常量,它有自己的地址空間,存放在堆空間。而其它兩個都存放在堆空間。

 


免責聲明!

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



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