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;
}