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[])構造器。