B.String Interview Questions

1.什么是Java中的String?String是一種數(shù)據(jù)類型嗎?

String是Java一個類,定義在java.lang包中,它不像int和long一樣是原始數(shù)據(jù)類型。String類相當于字符串,它應(yīng)用在幾乎所有的Java應(yīng)用中,有些關(guān)于String的有趣的事情我們是需要了解的。String是不可變的,final修飾,JVM用String池來存儲所有的String對象,另外一些String有意思的地方是我們可以通過雙引號和使用+運算符來實例化String對象。

2.有哪些不同方式創(chuàng)建String對象?

我們可以像普通對象一樣使用new操作來創(chuàng)建String對象,或者使用雙引號來創(chuàng)建。String還有一些構(gòu)造的方法通過char array, byte array, StringBuffer and StringBuilder來做。

String str = new String("abc");

String str1 = "abc";

我們可以使用雙引號創(chuàng)建String,JVM會在String池中查找是否有相同的存儲值的字符串。如果有,直接返回該字符串對象的引用,否則會創(chuàng)建一個新的字符串對象來存給定的值存入String池里。當我們使用new操作符,JVM創(chuàng)建字符串對象但不會將其存入String池。我們可以使用intern()方法來將String對象存到String池中,或者在String池中已經(jīng)存在相同值的時候直接返回其引用。

3.寫一個方法檢查輸入的字符串是順序和逆序都一樣的字符(Palindrome)?

一個“回文”String是指String的值正序、反序都是一樣的。例如:“aba”就是“回文”型字符串。

String類沒有提供反轉(zhuǎn)字符串的方法,但StringBuffer和StringBuilder類有反轉(zhuǎn)的方法,我們可以用來檢查String是否是“回文”。

4.寫一個方法可以刪除String中的指定字符串?

我們可以使用replaceAll方法來替換String,它的關(guān)鍵點在于可以接受String作為參數(shù),所以我們可以用Character類來創(chuàng)建字符串,然后替換掉空字符。

5.如何使String實現(xiàn)大小寫轉(zhuǎn)換?

我們可以使用String類的toUpperCase和toLowerCase方法來將字符串的字符全部大、小寫化。這些方法的區(qū)別在于可以接受Locale參數(shù),用locale規(guī)則來轉(zhuǎn)換字符串大小寫。

6.什么是String?subSequence方法?

Java1.4引入CharSequence接口且String實現(xiàn)了這個接口,其唯一原因就是將切分字符串的方法私有化。

7.如何比較兩個字符串?

String實現(xiàn)了Comparable接口且有兩個不同的compareTo()方法。

compareTo(String anotherString)方法比較字符串對象和傳入的字符參數(shù)的字典順序。如果字符對象先于參數(shù)里的字符,返回負整數(shù),否則返回正整數(shù)。如果兩個字符串相同則返回0,這時候equals(String str)也會返回true。

compareToIgnoreCase(String str):方法和第一個類似,區(qū)別在于它不區(qū)分字符大小寫。它使用CASE_INSENSITIVE_ORDER比較器使大小寫不敏感。如果返回值是0,那么equalsIgnoreCase(String str)也是返回true。

8.如何實現(xiàn)String轉(zhuǎn)char和char轉(zhuǎn)String?

這是個棘手的問題,因為String是一系列characters(字符串是由一串字符組成),所以我們不能轉(zhuǎn)成單個字符。我們可以使用charAt方法來獲取字符所在的索引位置或者用toCharArray方法來轉(zhuǎn)換String成字符數(shù)組??梢钥匆恍┺D(zhuǎn)換程序的例子String to character array to String。

9.如何實現(xiàn)String轉(zhuǎn)byte array和byte array轉(zhuǎn)String?

我們可以使用getBytes()方法來轉(zhuǎn)換String變成字節(jié)數(shù)組,我們可以用字符串構(gòu)造器new String(byte[] arr)來轉(zhuǎn)字節(jié)數(shù)組變成String。

10.是否可以在switch case使用String?

這是個棘手的問題,考察你對Java開發(fā)版本的知識點。Java7擴展了switch case使用字符串,之前的Java版本是不支持的。

如果你要實現(xiàn)一串字符串的條件流,你可以使用if-else條件,或在Java7及以上版本使用switch case來實現(xiàn)。

閱讀這篇文章Java Switch Case String的例子。

11.寫一個程序打印所有的組合String?

這是個棘手的問題,需要用到遞歸來查出所有的組合字符串,例如“AAB”組合可以有“AAB”,“ABA”,“BAA”幾種組合。

我們還需要使用Set來確保沒有重復(fù)的值,查看這篇文章有完整的程序find all permutations of String

12.寫一個函數(shù)找出給定String里最長的回問(palindrome)?

一個含有回文的字符串并且查找出最長的回文,查看這篇文章palindrome in a String

13.String, StringBuffer and StringBuilder三者有什么區(qū)別?

String是不可變和final型,所以當無論何時使用字符串操作,都是創(chuàng)建一個字符串。字符串操作是資源消耗,所以Java提供兩種工具類來操作字符串:StringBuffer和StringBuilder。

StringBuffer和StringBuilder是可變類。StringBuffer操作是線程安全和synchronized同步的,而StringBuilder是非線程安全。所以當多線程下應(yīng)該使用StringBuffer,在單線程環(huán)境使用StringBuilder。StringBuilder性能優(yōu)于StringBuffer,因為沒有被synchronized限制。

查看文章String vs StringBuffer vs StringBuilder了解更多細節(jié)。

閱讀這篇文章StringBuffer vs StringBuilder查看性能測試。

14.為什么String是不可變或者final的?

String是不可變和final的有幾個好處:

? 由于String的不可變性使得String池成為可能;

? 它增加了安全性,字符串可以存數(shù)據(jù)庫用戶名和密碼,這樣任何黑客沒法修改它的值;

? 因為String是不可變,所以在多線程中使用是安全的,我們不必考慮同步;

? 字符串被用在Java類加載器,不可變提供了安全性使得正確的類被加載器加載。

閱讀這篇文章why String is immutable in java了解更多細節(jié)。

15.如何切分String?

我們可以使用split(String regex)方法的規(guī)則來切分字符串成字符數(shù)組。

閱讀java String split了解更多。

16.為什么Char array比String更優(yōu)于存儲密碼?

String在Java中是不可變的,存儲在String池中。一旦被創(chuàng)建,就一直存于String池直至被垃圾回收掉,所以我們使用完有效密碼還是會在內(nèi)存中保留很長時間,也沒有辦法避免它不這樣。這樣就存在安全風(fēng)險,因為任何人只要dump出內(nèi)存,就能像清晰的文本一樣找出密碼。如果我們使用字符數(shù)組來存儲密碼,我們這樣就能讓密碼隱藏。所以我們能在String的生命周期里不用擔(dān)心String的安全威脅。

17.如何判斷兩個String是否相等?

兩種方法來檢查字符串是否相等,用“==”或者equals方法。當使用“==”操作符,它檢查的是值和引用是否相等,但我們編碼時,大多數(shù)情況只是檢查值是否相等。所以我們使用equals方法。

另一個函數(shù)equalsIgnoreCase檢查忽略大小寫的值相等。

18.什么是String Pool?

就像名字暗示的,字符串池是一個在Java內(nèi)存中存儲Strings的池子。我們知道String是特殊的類,我們創(chuàng)建字符串對象用new操作符也可以使用雙引號。

閱讀String Pool了解更多

19.String中intern()方法的作用?

當intern方法被調(diào)用,如果String池里包含了和這個字符串相同值的字符串,那么直接返回池中的字符串對象。否則,字符串對象會添加到池中,然后該字符對象的索引被返回。

該方法始終返回一個相同內(nèi)容的字符串,池里會確保返回的是唯一字符串。

20.Java中String是否線程安全?

String是不可變的,所以我們不能在程序里改變其值。因此是線程安全,多線程環(huán)境也是線程安全。查看thread-safety-in-java了解更多。

21.為什么HashMap的key流行用String?

因為String是不可變的,從一開始創(chuàng)建就把其hashcode緩存而且不需要再次計算。這個特性是它成為Map中key的最佳候選,同時它作為HashMap的key比其他對象作為key要效率快。這就是為什么HashMap的key常用String對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容