字符串-面试题
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;
}