String类:
字符串是一个特殊的对象。
字符串一旦被初始化,就不可以被改变。
String类不可以有子类,因为已经被final修辞。
Strings1 = “abc”; //s1在内存中是一个对象。
Strings2 = new String(“abc”); //s2在内存中有两个对象。
System.out.println(s1== s2); 结果为false,因为==是判断两个对象是否相同。
System.out.println(s1.equals(s2)); 结果为true,equals是判断两个字符串内容是否相同。equals是比较的两个地址值。
String类中的常用方法:
一,获取
1、length();获取某字符串的长度。注意:获取数组的长度是.length,没有括号。
2、charAt(int index); 获取字符串中某脚标的字符。
3、indexOf(intch); 获取ch在字符串中第一次出现的位置。
4、indexOf(int ch,int fromIndex
); 获取ch在字符串中从fromIndex开始往后第一次出现的位置。
5、indexOf(String char); 获取字符串char在字符串中第一次出现的位置。
6、indexOf(String char,int fromIndex
); 获取字符串char在字符串中从fromIndex开始往后第一次出现的位置。
例如:
String str = "fdalkgdkakl";
System.out.println(str.charAt(4));//打印出str中脚标为4的字符。值为k。如果脚标参数大于了字符串长度,会出现脚标越界异常:StringIndexOutOfBoundsException
System.out.println(str.indexOf(‘a’)); //打印出a在字符串中出现的第一个脚标。值为1。
System.out.println(str.indexOf("al"));//打印出字符串al在字符串中出现的位置,值为2,如果al不在字符串中,值为-1。
二,判断
1、contains(str):字符串中否包含某一个子串。
2、isEmpty():字符中是否有内容。实际是判断字符串的长度是否为0。
3、startsWith(str):字符串是否是以指定内容开头。
4、endsWith(str):字符串是否是以指定内容结尾。
5、equals(str):判断字符串的内容是否相同,复写了Object类中的equals方法。
6、equalsIgnoreCawse():判断字符串的内容是否相同,不区分大小写。
例如:
String str = "fdalkgdkakl.java";
System.out.println(str.contains("alk"));//值为true。
System.out.println(str.isEmpty());//值为false。
System.out.println(str.startsWith("kkk"));//值为false。
System.out.println(str.endsWith(".java"));//值为true。
System.out.println(str.equalsIgnoreCase("FDAlkgdkakl.java"));//值为true
三、转换
1、将字符数组转换成字符串。
构造函数:
1、String(char[])
2、String(char[],offset,count):将字符数组中的一部分转换成字符串,offset代表脚标,count代表位数,就是将offset脚标开始,数offset位的字符转换成字符串。
静态方法:
1、static String copyValueOf(char[])
2、static String copyValueOf(char[] data,int offset, int count):同构造参数一样。
3、static String valueOf(char[])
2、将字符串转换成字符数组。
toCharArray():
3、将字节数组转换成字符串。
String(byte[])
String(byte[],offset,count)参数同上面构造函数一样。
4、将字符串转换成字节数组。
getBytes():
5、将基本数据类型转换成字符串。
1、static String valuOf(int)
2、static String valuOf(double)
……
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
例如:
char[] ch = {'l','o','v','e','j','a','v','a'};
String str1 =new String(ch);
String str2 =new String(ch,1,4);
System.out.println(str1); //str1的值为lovejava。
System.out.println(str2); //str2的值为ovej。
String str3 ="lovejava";
char[] c = str3.toCharArray();
for(int x = 0; x<c.length; x++){
System.out.println(c[x]); //打印出c数组的各元素值:l o v e j a v a
}
四、替换
Stringreplace(oldchar,newchar): oldchar是被替换的字符子串,newchar是替换旧子串的新串。
例如:
String str1 ="love java"; //str1为原串。
String str2 = str1.replace("l","L"); //将原串中的l字符替换成大写的L字符。
String str3 = str1.replace("k","L"); //这时,被替换的k字符在原串中不存在,str3仍为原串。
String str4 = str1.replace("java","C++"); //用字符串"C++"替换原串中的"java"子串。
注意:替换是生成新的字符串,而不是将原串改变。原字符串是永远不会改变的。
System.out.println(str2);//str2值为Love java。
System.out.println(str3);//str3值为love java。
System.out.println(str4);//str4值为love C++。
五、切割
String[]split(regex):regex是分割符,将字符串切割成若干块,存在字符数组当中。
例如:
String str1 = "lovejava"; //str1为原串。
String[] str5 = str1.split(" ");//将原串以空格为分割符切成两个字符串存在字符串数组中。
六、子串。获取字符串中的一部分。
Stringsubstring(begin);获取字符串中的一部分,从begin开始,begin是起始脚标,到结尾。
Stringsubstring(begin,end);同样,从begin脚标开始,到end-1坐标结束,包含头不包含尾。
例如:
String str = "love java";
String str1 =str.substring(5);
String str2 =str.substring(1,6);//取脚标1到5的子串。
System.out.println(str1); //str1的值为java
System.out.println(str2); //str2的值为ove j
七、转换、去除空格、比较
1、大小写相互转换。
toUpperCase();把字符串全部变成大写。
toLowerCase();把字符串全部变成小写。
2、去除字符串两边的空格。
trim();将字符串两端的空格去掉。
3、比较。
compareTo();将两个字符串进行自然顺序的比较。返回值负数、0、正数。如果原字符串比参数字符串大,返回正数,相等,返回0,否则返回负数。不必在乎返回值的大小,只管是正还是负就行。
例如:
String str = " love java ";
String str1 = str.toUpperCase(); //将str全部变成大写。
String str2 = str.toLowerCase(); //将str全部变成小写。
String str3 = str.trim(); //将str两边的空格去掉。
String str4 =" verybeautiful";
int x = str4.compareTo(str3); //将str4和str3进行比较。
System.out.println(str1); //str1值为: LOVE JAVA
System.out.println(str2); //str2值为: love java
System.out.println(str3); //str3值为:love java
System.out.println(x); //x的值为-76,说明str4比str3小。
练习01:
/*
*手动制作一个去除字符串两边空格的功能。不能用trim()。
* */
package String_Test;
publicclass String_Test_02 {
publicstaticvoid main(String[] args) {
String s =" hello hema "; //任意定义两边有空格的字符串。
System.out.println("("+s+")");//打印原串。
String s1 =myTrim(s); //调用手动制作的去除两边空格的方法。
System.out.println("("+s1+")"); //打印新串。
}
//人工去除两边空格的方法。
publicstatic String myTrim(String str){
//分别定义字符串左右两边的脚标变量。
int left = 0;
int right =str.length()-1;
while(left<=right && str.charAt(left)==' ')//让左边脚标往右移,直到遇到不是空格的字符。
left++;
while(left<=right && str.charAt(right)==' ')//同理,右边往左边移。
right--;
return str.substring(left, right+1); //用获取子串的方法,取不为空格的字符串段。并返回。
}
}
练习02:
/*
*将一个字符串进行反转。
*思路:
* 1、将字符串变成字符数组。
* 2、将字符数组反转。
* 3、将反转后的数组变成字符串。
* */
package String_Test;
publicclass String_Test_03 {
publicstaticvoid main(String[] args){
String s =" hema good "; //定义原字符串,要将它反转过来。
System.out.println(fan_String(s)); //打印反转后的字符串。
}
//定义一个反转字符串的方法
publicstatic String fan_String(String str){
char[] ch = str.toCharArray(); //将字符串转成字符数组。
fan_char(ch); //调用字符数组反转函数。
returnnew String(ch); //再将字符数组转成字符串。
}
//定义一个反转字符数组的方法
publicstaticvoid fan_char(char[] cha){
for(int i=0,j=cha.length-1; i<j; i++,j--){
char temp = cha[i];
cha[i] = cha[j];
cha[j] = temp;
}
}
}
练习03:
/*
*获取一个字符串在另一个字符串中出现的次数。
* "gkdabcslgfabcjdslfabckj" "abc"
* */
package String_Test;
publicclass String_Test_04 {
publicstaticvoid main(String[] args){
String str ="gkdabcslgfabcjdslfabckj";
String key ="abc";
System.out.println("出现的次数为:"+getStringCount(str,key));
}
//定义获取一个字符串在另一个字符串中出现的次数的方法。
publicstaticint getStringCount(String str1,Stringkey){
int count = 0; //定义计数器。
int index = 0; //定义出要查的字符串脚标。
while((index = str1.indexOf(key))!=-1){
System.out.println(str1);
str1 = str1.substring(index+key.length());
count++;
}
return count;
}
}
练习04:
/*
*获取两个字符串中最大相同子串。
* "fldksaheima" "dfsheimakwlll"
* */
package String_Test;
publicclass String_Test_05 {
publicstaticvoid main(String[]args){
Stringstr1 = "fldksaheima";
Stringstr2 = "dfsheimakwlll";
System.out.println(getSimpleString(str1,str2));
}
//获取两个字符串中最大相同子串的方法。
publicstaticStringgetSimpleString(Strings1,String s2){
//先判断两个参数谁大谁小。
Stringmax = (s1.length()>s2.length())?s1:s2;
Stringmin = (max == s1)?s2:s1;
for(int x=0; x<min.length()-1;x++){
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++){
Stringtemp = min.substring(y,z);
//System.out.println(temp);
if(max.contains(temp))
return temp;
}
}
return"";
}
}
StringBuffer:
StringBuffer是字符串缓冲区。
1、它的长度是可以变化的。
2、可以存入多种数据类型。
3、最终通过toString方法变成字符串。
其功能:
一、存储
append():添加数据,添加到末尾处。返回的类型还是缓冲区。
insert(index,XXX):将XXX数据添加到index的脚标位置。
例如:
StringBuffer sb =new StringBuffer();
sb.append("hello").append(true).append(55);
//方法调用链,方法的返回值类型永远都是StringBuffer同一种类型。
//append()方法中可以添加各种数据类型。
sb.insert(2,"fanbo");//向缓冲区中插入fanbo这个字符串,插到脚标为2的地方。
System.out.println(sb);//sb的值为:hefanbollotrue55
二、删除
delete(start,end):删除缓冲区的数据,从脚标start到end,包含start不包含end。返回值仍是缓冲区。
deleteCharAt(index):删除指定脚标的字符。返回值仍是缓冲区。
注意:清空缓冲区的操作:X.delete(0,X.length());
三、获取
charcharAt(int index):获取某脚标位的字符。
intindexOf(String str):获取某字符串所处的脚标。
intlength():获取缓冲区的长度。
Stringsubstring(int start,int end):获取缓冲区中的子字符串,注意返回的是字符串。
四、修改
replace(start,end,string):用string字符串替换掉缓冲区中start脚标到end脚标的字符串。返回值仍是缓冲区。
setChatAt(intindex,char ch):把缓冲区中index脚标的字符替换成ch。注意无返回类型,只改。
五、反转
revese():将缓冲区中的字符串反转。返回值仍是缓冲区。
特殊方法:
voidgetChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将缓冲区中的指定数据存到指定字符数组中,将缓冲区中从srcBegin到srcEnd的数据存到dstBegin脚标开始的dst字符数组中。
StringBuffer和StrinBuilder的不同:
功能都一样。
StringBuffer是线程同步。安全。
StringBuilder是线程不同步。不安全,但效率。1.5版本后出现的,出现的原因是提高效率。
开发基本都用StringBuider,遇到多线程,可以自己加锁。
升级三个因素:
1、提高效率
2、简化书写
3、提高安全性