第一部分:String概述
1、String类的定义是:public static class String
final说明String没有子类,它的功能不能被覆写。
2、
String str = "abc";
String str1 = new String("abc");
a、以上代码有什么区别?
第一句在内存中创建了一个对象String类对象"abc"。
第二句在内存中创建了两个对象,一个是通过new创建的,另一个是"abc"。
b、
str==str1 返回false,原因:==比较的引用变量str和str1的内存地址值,它俩是不相等的。
str.equals(s2) 返回true,原因:因为String类覆写了Object类的equals方法,定义了自己的独特内容,该方法用于判断字符串内容是否相同。
3、解读:String s1 = "abc";
s1是一个引用类型变量,"abc"是一个对象
4、字符串最大特点:一旦被初始化,就不能改变。
例子:
String s1 = "abc";
s1 = "kk";
输出s1结果为kk。
原因:s1变量存储的地址变了,指向了kk对象内容,而"abc"还继续留在内存中。
5、内存中有一个常量池,里面是一个数组,存放a等字符。
第二部分:String的常见功能
String类是适合于描述字符串常量,那么它就提供了多个方法对字符串进行操作。
那么常见的操作有:
1、获取
1.1、字符串中的包含的字符数,也就是字符串的长度
int length():获取长度
String str = "abcdefakpf";
System.out.println(str.length());
1.2、根据位置获取位置上某个字符
char charAt(int index)
System.out.println(str.charAt(4));//当访问到字符串中不存在的角标时会发生StringIndexOutOfBoundsException
1.3、根据字符获取该字符在字符串中的位置
int indexOf(int ch):返回的是ch在字符串中第一次出现的位置,ch为字符的ASCII值
String s1 = "abc";
int ch = s1.indexOf(97);
System.out.println(ch);//输出0
int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位
int indexOf(String str):返回的是str在字符串中第一次出现的位置
System.out.println(str.indexOf('a'));//如果没有找到,返回-1
int indexOf(String str,int fromIndex):从fromIndex指定位置开始,获取str在字符串中出现的位置
int lastIndexOf(int ch):返回字符从右边开始数起第一次出现的位置
2、判断
2.1、字符串中是否包含某一个字串
boolean contains(String str)
特殊之处:indexOf(str):可以返回str第一次出现位置,如果返回-1,表示该str不再字符串中存在,所以,也可以用于对指定字符串判断是否包含。
if(str.indexOf("aa")!=-1)
而且该方法,既可以判断又可以获取出现的位置
如果只是判断,用contains,如果既要判断又要获取位置,用indexOf
2.2、字符中是否有内容
boolean isEmpty()
2.3、字符串是否是以指定内容开头
boolean startsWith(String str);
2.4、字符串是否是以指定内容结尾
boolean endsWith(String str);
2.5、判断字符串内容是否相同。复写Object的方法
boolean equals(str)
2.6、判断内容是否相同,并忽略大小写
boolean equalsIgnoreCase(String str)
3、转换
3.1、将字符数组转换成字符串
构造函数:String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串,offset是起始位,count是个数。
这是经常使用的办法
new String(buf,0,len);
静态方法:
static String copyValueOf(char[])
static String copyValueOf(char[] data,int offset,int count)
static String valueOf(char[])
3.2、将字符串转换成字符数组(重点)
char[] toCharArray()
String s1 = "zxshidhif";
char[] chs = s1.toCharArray();
for(int i = 0;i<chs.length;i++)
{
System.out.println(chs[i]);
}
3.3、将字节数组转换成字符串(重点)
String(byte[])
String(byte[],offset,count):将字符数组中的一部分转成字符串,offset是起始位,count是个数
3.4、将字符串转成字节数组(重点)
byte[] getBytes()
String s1 = "abc";
byte[] by = s1.getBytes();
for(int i = 0;i<by.length;i++)
{
System.out.print(by[i]+" ");
}
输出结果:
</pre><pre name="code" class="plain">97 98 99
3.5、将基本数据类型转换成字符串
String valueOf(int)
String valueOf(double)
注:3+""也能将int型转换成字符串型,也 可以写成 String.valueOf(3)
特殊:字符串和字节数组在转换过程中,是可以指定编码表的
4、替换
String replace(char oldchar,char newchar)。这个方法返回的是一个新的字符串,原有的字符串不会发生改变。
String s = "hello java";
String s1 = s.replace('a','n');
String s2 = s.replace('q','n');//如果要替换的字符不存在,返回的还是原串
String s3 = s.replace("java","world");//输出hello world
System.out.println("s="+s);//输出 hello java
System.println("s1="+s1);//输出 hello jnvn
5、切割
String[] split(String regex)
String s = "zhangsan,lisi,wangwu";
String[] arr = s.split(",");
for(int i = 0;i<arr.length;i++)
{
System.out.pritnln(arr[i]);//输出zhangsan lisi wangwu
}
6、子串。获取字符串中的一部分。这个方法返回的也是新的字符串,原有字符串不会发生改变。而且截取范围包头不包尾!
String substring(int beginIndex)
String substring(int beginIndex,int endIndex)
String s = "abcdef";
sop(s.substring(2));//输出cdef。如果角标不存在,会发生字符串角标越界异常
sop(s.substring(2,4));//输出cd 包含头,不包含尾。s.substring(0,s.length())
7、转换、去除空格、比较
7.1 将字符串转成大写或者小写
String toUpperCase()
String toLowerCase()
7.2 将字符串两端的多个空格去除
String trim()
String s = " hello Java ";
System.out.println(s.trim());//输出"hello Java"
应用:邮箱登录时输入了空格,使用函数可以忽略空格
7.3 对两个字符串进行自然顺序(ASCII码值)的比较(重点)
int compareTo(String)
String s1 = "acc";
String s2 = "aaa";
System.out.println(s1.compareTo(s2));//返回2,因为c的ASCII值是99,a是97,相减后得2
第三部分:字符串String的练习
需求:找出两个字符串的相同的最大子串
public static String getMaxSubString(String str1,String str2)
{
String max = "",min = "";
max = (str1.length()>str2.length())?str1:str2;
min = (max==str1)?str2:str1;
for(int x = 0; x<min.length(); x++)
{
for(y = 0,z=min.length()-x;z!=min.length()+1;y++,z++)
{
String temp = min.substring(y,z);//substring方法是包含头不包含尾
if(max.contains(temp))//if(str1.indexOf(temp)!=-1)
return temp;
}
}
}
第四部分:StringBuffer
1、StringBuffer概述
StringBuffer是字符串缓冲区,是一个容器。
特点:
a、长度是可以变化的
b、可以操作多个数据类型
c、最终会通过toString方法变成字符串
什么时候用?
当数据类型不确定,而且最终变成字符串,并且数据个数不确定。
2、方法:
1)存储
StringBuffer append():将指定的数据类型作为参数添加到已有数据的结尾处。这个方法不会返回新的缓冲区。
StringBuffer sb = new StringBuffer();
sb.append(64);
sop(sb.toString());//输出64
这个可以使用方法调用链
sb.append("abc").append(true).append(34);//方法调用链,因为append返回的还是同一对象
StringBuffer insert(index,数据):可以将数据插入到指定index位置。
2)删除
StringBuffer delete(start,end):删除缓冲区的数据,包含头不包含尾。
StringBuffer deleteCharAt(index):删除指定位置的字符
3)获取
char charAt(int index)
int indexOf(String str)
int length()
int lastIndexOf(String str)
String substring(int start)
4)修改
StringBuffer replace(int start, int end, String str)
void setCharAt(int index, char ch)
StringBuffer sb = new StringBuffer("abcde");
sb.replace(1,4,"java");//输出ajavae
sb.setCharAt(2,"k");
sop(sb.toString());//输出ajkvae
5)反转
StringBuffer reverse();
6)将缓冲区里的指定字符存储到字符数组中
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 包头不包尾
第五部分:StringBuilder
1、在jdk1.5之后出现了StringBuilder。
2、StringBuffer和StringBuilder的区别
StringBuffer是线程同步的:一次只能一个人对其进行操作。
StringBuilder是线程不同步的:如果是单线程的话,使用StringBuilder效率会高。
以后开发建议使用StringBuilder
升级三个因素:
1、提高效率
2、简化书写
3、提高安全性