字串-面試題

读书声起五更天發表於2024-09-13

String 的不可變性

  • String底層是一個 final修飾的字元陣列,當改變String的值時,會在常量池生成新的字串,字元陣列的地址指向常量池中新的字串

StringBuffer的擴容原理


String、StringBuffer、StringBuilder三者對比

  • Strings是不可變的字元序列,底層是一個final修飾的字元陣列。每次值改變時,會在常量池都會建立新的字串

  • StringBuffer和StringBuilder時可變的字元序列,底層是一個字元陣列儲存資料。

    StringBuffer的初始化長度是16。當長度達到16時,會擴容為原長度的2倍+2,

    並且呼叫Arrays.copyOf( )方法,將原字元陣列的元素,複製到新的陣列中

  • StringBuilder是執行緒安全的,StringBuilder是執行緒不安全的。


對字串的指定部分進行反轉

public String reverse(String str,int startIndex,int endIndex){
  //雙指標 操作 字元陣列
  char[] chars = str.toCharArray();
  for (int x = startIndex,y=endIndex; x<y; x++,y--) {
      char temp=chars[x];
      chars[x]=chars[y];
      chars[y] = temp;
  }
  return new String(chars);
}

獲取一個字串在另一個字串中出現的次數

String str = "ababkkcadkabkebfabkabkskabab";
String regStr="ab";

int subLength=regStr.length();
int count = 0;
int index=0;

while((index=str.indexOf(regStr,index))!=-1){
    count++;
    index += subLength;
}

獲取兩個字串中最大的相同子字串

/*
思路分析:
      最大公約數:從最大子串開始找
      雙指標操作
*/
public String getMaxSameString(String str1,String str2){
  //判斷兩個字串的長度
  String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
  String minStr = (str1.length() < str2.length()) ? str1 : str2;
  //外層迴圈的次數
  int len = minStr.length();

  for (int i = 0; i < len; i++) {
      for (int x = 0,y=len-i;y<=len ;x++,y++ ) {
          String subStr = minStr.substring(x,y);
          if(maxStr.contains(subStr)){
              return subStr;
          }
      }
  }
  return null;
}

StringBuffer 對 null值的處理


相關文章