(一)基本概念
API中的解释:
String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。
字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。
String对象是不可变——是因为String类是final的
(二)String的构造函数
常用的几种构造方法
- String( )
- String( byte[] bytes )
- String( char[] value )
- String( String original )
- String( StringBuffer buffer )/String( StringBuilder builder )
Tips:
//String str = new String({'a','b','c'});
//会报错:不能直接放进去
char[] arr = {'a','b','c'};
String str = new String(arr);
(三)String的常用成员函数
length:长度
-
int length()
length/length()/size()区别: - length是属性,属于数组 - length()是方法,属于对象 - size()是集合的方法,用于计算集合的长度
indexOf:索引,第一次出现位置
- int indexOf(int ch)
- int indexOf(int ch,int fromIndex)
- int indexOf(String str)
- int indexOf(String str,int fromIndex)
lastIndexOf:索引,最后一次出现位置
substring:截取子串
-
String substring(int beginIndex)
-
String substring(int beginIndex,int endIndex)
注意: 子串包括beginIndex,不包括endIndex。
split:拆分字符串
-
String[] split(String regex)
-
String[] split(String regex,int limit)
根据正则表达式拆分
toCharArray:字符串转字符数组
getBytes:字符串转字节数组
toLowerCase:字符串中字母转小写
toUpperCase:字符串中字母转大写
replace:字符串中内容替换
- String replace(char oldChar,char newChar)
- String replaceAll(String regex,String replacement)
- String replaceFirst(String regex,String replacement)
trim:字符串两端去除空格
- String trim()
concat:字符串连接
equals:比较
equalsIgnoreCase:比较,不考虑大小写
contains:是否包含子串
startsWith:是否以指定字符串开头
- boolean startsWith(String prefix)
- boolean startsWith(String prefix,int toffset):从指定索引处是否以指定前缀开始
endsWith:是否以指定字符串结尾
- boolean endsWith(String prefix)
compareTo:按字典顺序比较
compareToIgnoreCase:按字典比较,不考虑大小
(四)String方法编程题练习
将字符串首字母大写,其余字母小写
String test1(String str){
String temp1 = str.substring(0, 1).toUpperCase();//取得首字母,将首字母大写
String temp2 = str.substring(1,str.length()).toLowerCase();//其余小写
String s = temp1.concat(temp2);
return s;
}
给定一个字符串,按字典顺序排序
String test2(String str){
//冒泡排序针对的是数组,所以先转为数组再进行
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
for (int j = 0; j < ch.length-i-1; j++) {
char temp;
if(ch[j] > ch[j+1]){
temp = ch[j+1];
ch[j+1] = ch[j];
ch[j] = temp;
}
}
}
String s = String.valueOf(ch);
return s;
}
一个子串在字符串中出现次数
int test3(String str,String subStr){
int i = 0;//次数
String temp = str;
int index;//索引
while((index = temp.indexOf(subStr)) != -1){//subStr第一次出现的索引
i++;
temp = temp.substring(index+subStr.length());//在余下的字符串继续找有没有子串
}
return i;
}
求两个字符串的最大相同子串
String test4(String str1,String str2){
String subStr;
//外层:子串长度的确定str1.length()-i
for (int i = 0; i < str1.length(); i++) {
//内层:截取其中相应长度的子串,终止条件k<str1.length()+1(边界)
//j和k固定子串长度,j++和k++使子串右移
for (int j = 0, k = str1.length() - i; k != str1.length() + 1; j++, k++) {
String temp = str1.substring(j, k);
if(str2.contains(temp)){
subStr = temp;
return subStr;
}
}
}
return null;
}
字符串反转
String test5(String str){
String newStr;
char[] arr = str.toCharArray();
char[] temp = new char[arr.length];//倒序
for (int i = 0; i < arr.length; i++) {
temp[i] = arr[arr.length - i - 1];
}
newStr = String.copyValueOf(temp);
return newStr;
}
实现trim()函数功能
String test6(String str){
String newStr = null;
int start = 0;
int end = str.length()-1;
while(start <= end && str.charAt(start) == ' '){
start ++;
}
while(start <= end && str.charAt(end) == ' '){
end --;
}
newStr = str.substring(start, end+1);
return newStr;
}
(五)StringBuffer与StringBuilder
StringBuffer:线程安全的可变字符串序列
StringBuilder:线程不安全的可变字符串序列
PS:线程不安全的效率更高
常用方法:
- append
- insert
- delete
- deleteCharAt
- replace
- reverse