必須要會回答的Java面試題(字串篇)

IT_熊發表於2019-10-20

最近很多學習java的小白問我字串相關的問題,覺得很有必要整理下,以方便初學者理解字串以及應對今後面試中考官的提問。

如果你是有幾年Java開發經驗,可以根據目錄選擇性的閱讀以下內容,並歡迎留言補充。

問題列表如下:

0.String是最基本的資料型別嗎?
1.String是否可以被繼承?
2.Java中的String a = "abc"和String a = new String("abc")的區別?
3.為什麼字串是不可變的?
4.什麼是String常量池?
5.使用字串初始化程式碼:String a = new String("abc");建立多少個物件?
6.String類中intern()的作用?
7.使用equals()和'=='進行字串比較的差異?
8.String StringBuffer StringBuilder 三者各自執行緒安全性如何?
9.String,StringBuffer以及StringBuilder之間的區別?
10.如何連線多個字串。
11.如何分割一個String?
12.如何判斷兩個String是否相等?
13.String類中,字串長度是否有限制?
14.Java String “+”連線符拼接字串原理?

0.String是最基本的資料型別嗎?
Java中基本資料型別包括byte,int,char,long,float,double,boolean,short一共八個;String是定義在 java.lang 包下的一個類。它不是基本資料型別。


1.String是否可以被繼承?
不可以,因為String類似final類。


2.Java中的String a = "abc"和String a = new String("abc")的區別?
String a = "abc" 使用常量進行初始化,初始化後記憶體儲存在String常量池中
String a = new String("abc") 建立字串物件,JVM建立字串物件但不儲存於字串池。


3.為什麼字串是不可變的?
因為String類似final類。


4.什麼是String常量池?
字串池是一個特殊的記憶體區域,與儲存這些字串常量的常規堆記憶體分開。這些物件在應用程式的生命週期中被稱為字串變數。
如:雙引號直接建立的字串,String a = "abc",會將"abc"儲存在該區域。


5.使用字串初始化程式碼:String a = new String("abc");建立多少個物件?
上面一行程式碼將會建立1或2個字串。如果在字串常量池中已經有一個字串“abc”,那麼就只會建立一個“abc”字串。如果字串常量池中沒有“abc”,那麼首先會在字串池中建立,然後才在堆記憶體中建立,這種情況就會建立2個物件了。


6.String類中intern()的作用?
呼叫該方法時,如果池已包含String與equals(Object)方法確定的此物件相等的字串,則返回池中的字串。否則,將此String物件新增到池中,並String返回對此物件的引用。
它遵循對於任何兩個字串s和t,s.intern()==t.intern()是true當且僅當s.equals(t)是true。意味著如果s和t都是不同的字串物件並且具有相同的字元序列,則在兩者上呼叫intern()將導致由兩個變數引用的單個字串池文字。
7.使用equals和'=='進行字串比較的差異?
字串中equals是重寫的一個方法,比較字串中value字元陣列中字元是否一致,即比較的是字串的值,==不僅比較字串的值,而且還比較兩個字串所在記憶體地址是否相同。


8.String StringBuffer StringBuilder 三者各自執行緒安全性如何?
String  StringBuffer執行緒安全,StringBuilder非執行緒安全。


9.String,StringBuffer以及StringBuilder之間的區別?
String是值不可變類,每次在String物件上的操作都會生成一個新的物件;StringBuffer和StringBuilder則允許在原來物件上進行操作,而不用每次增加物件;StringBuffer是執行緒安全的,但效率較低,而StringBuilder效率最高,但非執行緒安全。


10.如何連線多個字串。
String:通過解讀Java API,可以知道Java為字串連線運算提供特殊支援。 字串連線是通過StringBuilder (或StringBuffer )類及其append方法實現的。
StringBuffer:使用append實現
StringBuilder:使用append實現。


11.如何分割一個String?
可以使用字串分隔函式:public String[] split(String regex),根據傳入的正則字串進行分割,注意,如果最後一位剛好有傳入的字元,返回陣列最後一位不會有空字串。


12.如何判斷兩個String是否相等?
有兩種方式判斷字串是否相等,使用"=="或者使用equals方法。當使用"=="操作符時,不僅比較字串的值,還會比較引用的記憶體地址。大多數情況下,我們只需要判斷值是否相等,此時用equals方法比較即可。
還有一個equalsIgnoreCase可以用來忽略大小寫進行字串值比較。


13.String類中,字串長度是否有限制?
可以看字串類的原始碼,字串使用char陣列存放字元,該字元陣列為定義最大長度,故,理論上來說String是沒有長度限制的,限制的是你的記憶體有多大。


14.Java String “+”連線符拼接字串原理?
String字串拼接通過StringBuilder走中間過程,通過append方法實現。

程式有大量字串拼接時,建議直接StringBuilder實現,就不需要底層new很多臨時String物件了。注意null參與拼接時會變成字串"null"。

相關問題持續更新彙總,逐步新增程式碼及更詳細的原理解析。

                                                                             

 

相關文章