1. 程式人生 > >Java面試題—字符串

Java面試題—字符串

gpo 顯示 自己 stringbu 結構 nbsp build int ()

  如果明天你要參加一場面試,面試官有個題目是:說說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()不是字符串常量,它有自己的地址空間,存放在堆空間。而其它兩個都存放在堆空間。

Java面試題—字符串