「每日一面」String 相關面試題全解

問:下面程序的運行結果是什麼?

String s1 = "abc";StringBuffer s2 = new StringBuffer(s1);System.out.println(s1.equals(s2)); //1,falseStringBuffer s3 = new StringBuffer("abc");System.out.println(s3.equals("abc")); //2,falseSystem.out.println(s3.toString().equals("abc")); //3,true 

答:註釋 1 打印為 false,主要考察 String 的 equals 方法,String 源碼中 equals 方法有對參數進行 instance of String 判斷語句,StringBuffer 的祖先為 CharSequence,所以不相等; 註釋 2 打印為 false,因為 StringBuffer 沒有重寫 Object 的 equals 方法,所以 Object 的 equals 方法實現是 == 判斷,故為 false; 註釋 3 打印為 true,因為 Object 的 toString 方法返回為 String 類型,String 重寫了 equals 方法實現為值比較。

問:String、StringBuffer、StringBuilder 的區別是什麼?(高頻)

答:String 是字符串常量,StringBuffer 和 StringBuilder 都是字符串變量,後兩者的字符內容可變,而前者創建後內容不可變;StringBuffer 是線程安全的,而 StringBuilder 是非線程安全的,線程安全會帶來額外的系統開銷,所以 StringBuilder 的效率比 StringBuffer 高;String 的每次修改操作都是在內存中重新 new 一個對象出來,而 StringBuffer、StringBuilder 則不用,且提供了一定的緩存功能,默認 16 個字節數組的大小,超過默認的數組長度時擴容為原來字節數組的長度 * 2 + 2,所以使用 StringBuffer 和 StringBuilder 時可以適當考慮下初始化大小,以便通過減少擴容次數來提高代碼的高效性。

問:String 為什麼是不可變的?

問:說說 String str = "hello world"; 和 String str = new String("hello world"); 的區別?

問:String 為什麼是不可變的?

問:說說 String str = "hello world"; 和 String str = new String("hello world"); 的區別?(高頻)

答:在 java 的 class 文件中有專門的部分用來存儲編譯期間生成的字面常量和符號引用,這部分叫做 class 文件常量池,在運行期間對應著方法區的運行時常量池,所以 String str = "hello world"; 在編譯期間生成了 字面常量和符號引用,運行期間字面常量 "hello world" 被存儲在運行時常量池(只保存了一份),而通過 new 關鍵字來生成對象是在堆區進行的,堆區進行對象生成的過程是不會去檢測該對象是否已經存在的,所以通過 new 來創建的一定是不同的對象,即使字符串的內容是相同的。


問:用 java 代碼實現字符串的反轉?

答:這道題的答案很多,下面給出兩種常見的答案。

使用 JDK 中 StringBuffer(併發安全)或者 StringBuilder 的反轉方法,這是最好的辦法,不僅速度快、效率高,代碼如下:

public String reverse(String str){ if ((null == str) || (str.length() <= 1)){return str;}return new StringBuffer(str).reverse().toString();}

炫技能使用遞歸方案實現,代碼如下:

public String reverse(String str) {if((null==str)||str.length()<=1){return str;}return reverse(str.substring(1))+str.charAt(0);}

首尾交換法

public static void swap(char[] charArr, int front, int end){while(front < end){char tmp = charArr[end];charArr[end] = charArr[front];charArr[front] = tmp;front++;end--;}}

問:用 java 代碼來檢查輸入的字符串是否迴文(對稱)?

答:這道題的答案也有很多,下面給出兩種常見的答案。

使用 JDK 現有 API 實現,代碼如下:

boolean isPalindrome(String str) {if (str == null) {return false;}StringBuilder strBuilder = new StringBuilder(str);strBuilder.reverse();return strBuilder.toString().equals(str);}

刪除字符串中重複的字符

public static String removeDuplicate(String s){char[] arr = s.toCharArray();int len = arr.length;for(int i=0; i

問:為什麼針對安全保密高的信息,char[] 比 String 更好?

答:因為 String 是不可變的,一旦創建就不能更改,直到垃圾收集器將它回收才能消失,即使我們修改了原先的變量,實際上也是在內存中新建一個對象,原數據還是保留在內存中等待回收;而字符數組 char[] 中的元素是可以更改的,也就是說像密碼等保密信息用完之後我們可以馬上修改它的值而不留痕跡,從而相對於 String 有更好的安全性。

字符串KMP算法

內容太多,可以參考這個鏈接文章

https://blog.csdn.net/jia635/article/details/80330998

「每日一面」String 相關面試題全解


分享到:


相關文章: