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對象。