String 的 10 道經典面試題

1、String 是基本數據類型嗎?

答:不是。

2、String 是可變的?

答:String是final類型的,不可變。

3、怎麼比較兩個字符串的值一樣,怎麼比較兩個字符串是否同一對象?

答:比較兩個字符串值一樣用equals,比較是否同一對象用"=="。

4、switch 中可以使用 String 嗎?

答:jdk7及其以上版本的switch可以使用String類型。

5、String str = new String("abc");創建了幾個對象,爲什麼?

答:創建了兩個,"abc"本身創建在常量池中,通過new方法又創建在堆中。

6、String、StringBuffer、StringBuilder 有什麼區別?

答:

1.可變性   String 類中使用字符數組保存字符串,private final char value[],所以 String 對象是不可變的。StringBuilder 與 StringBuffer 都繼承自AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符數組保存字符串,char[],value,這兩種對象都是可變的。
2.線程安全性   String 中的對象是不可變的,也就可以理解爲常量,線程安全。AbstractStringBuilder 是 StringBuilder 與 StringBuffer 的公共父類,定義了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。StringBuilder 並沒有對方法進行加同步鎖,所以是非線程安全的。
3.性能    每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然後將指針指向新的 String 對象。StringBuffer 每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象並改變對象引用。相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。

4對於三者使用的總結:
如果要操作少量的數據用 = String
單線程操作字符串緩衝區 下操作大量數據 = StringBuilder
多線程操作字符串緩衝區 下操作大量數據 = StringBuffer

7、String.trim()方法去掉的是哪些字符?

答:trim去掉字符串首尾的空白字符

8、String 可以被子類繼承嗎?

答:因爲String是final類型,所以不能被繼承。

9、可以自定義 java.lang.String 類並使用嗎?

答:可以自定義java.lang.String類並編譯成功,但不能被加載使用。

10、String 與 byte[]兩者相互之間如何轉換?

答:String 轉換 byte[] 通過String類的getBytes方法;byte[] 轉換 String通過new String(byte[])構造器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章