关于字符串的内容中大多都是一些需要记忆和练习的方法,在此文章中说一说常用的方法。
一. String类概述
1.创建一个String对象
(1)以字面值的形式建立一个String对象:
String s1 = “abc”;
s1是一个String类型的变量,”abc”是一个对象,以字面值创建String类型的对象时,会先去字符串池中查找是否有abc这个字符串,如果有,s1就指向“abc“,如果没有就ch创建一个字符串abc加入到串池中 ,并把这个对象的地址赋给s1。
(2)new一个String对象
String s2 = new String(“abc”);
在堆内存中新建一个String对象,把地址赋给s2。
此方法与第一种方法的不同之处在于s1只有一个对象就是”abc”这个字符串,第二种方法却有两个对象:new一个String对象和”abc”这个字符串。
注意点:当一个字符串被创建出来后时不可以改变。
我们来通过代码看一看这两种方式:
class Test1 {
public static void main(String[] args) {
//利用字面值创建一个字符串
String s1 = "abc";
//利用new方法创建一个字符串
String s2 = new String("abc");
//s1指向字符串池中abc字符串,所以为真
System.out.println(s1=="abc");//true
//s2指向堆中对象为假
System.out.println(s2=="abc");//false
//s1指向abc字符串,s2指向堆中String对象所以为假
System.out.println(s1==s2);//false
//因为String类中复写了Object的equals方法,比较的内容,所以为真
System.out.println(s1.equals(s2));//true
}
}
二. String类常见操作
1.获取
1>length()
返回int类型,获取此字符串的长度
2>charAt(int index)
返回char类型,根据指定下标获取该位上的字符,如果输入的下标不存在,抛出字符串角标越界异常:StringIndexOutofBoundsException
3>indexOf(int ch)
返回int类型,根据字符获取其第一次出现的位置,注意此方法传入的int类型,是将字符转成数字后的值,如果要此字符不存在返回-1
indexOf(int ch,int formIndex)
返回int类型,从formIndex下标位置开始,获取到该字符在字符串中的第一次出现的位置
indexOf(String str)
返回int类型,返回字符串中子串第一次出现的下标
indexOf(String str,int formIndex)
返回int型,从指定位置开始获取子串出现的位置
4>lastIndexOf(char ch)
返回int类型,从字符串末尾开始查找,返回指定字符的位置,也就是返回这个字符串中此字符最后一次出现的位置
5>获取子串
a> substring(int beginIndex)
返回String类型,为字符串的一个子串,从指定位置开始到字符串的结尾
b>substring(int beginIndex,int endIndex)
返回String类型,为字符串的一个子串,从指定位置开始到的指定位置结束的子串。
注意点:截取的字符串包含beginIndex,不包含endIndex,比如一个字符串为“abcde”,调用substring(2,4),获取到的子串为“cd“,他是从beginIndex一直到endIndex-1这一段字符串。
2. 判断
返回类型都是boolean型的
1>contains(CharSequence s)
判断字符串中是否包含某一个子串,CharSequence是一个接口,它包含了char、String等类型,我们就把他看做一个子串就可以。
我们也可以通过indexOf方法来判断,因为当子串或字符不存在时,该方法返回-1,如果我们既要拿到子串的位置又要判断子串是否存在,就用indexOf方法。
2>isEmpty()
判断字符串是否为空,原理就是判断字符串的长度是否为0。
3>startsWith(string s)
判断此字符串是否以指定内容开头
4>endsWith(String s)
判断此字符串是否以指定内容结尾
5>equals(String str)
判断字符串内容是否相同
6>equalsIgnoreCase(String str)
判断字符串内容是否相同,并忽略大小写
3.转换
1>将字符数组转换成字符串
第一种方式通过构造函数:
a)new String(char[] ch)
将字符数组作为参数传递到构造函数中
b)new String(char[] ch,int offset,int count)
将字符数组作为参数转换成字符串,offset是开始位,count是长度。
第二种方式通过String类的静态方法将字符数组转换成字符串
a)String.copyValueOf(char[]ch)
b)String.copyValueOf(char[] ch,intoffset.int count)
2> toCharArray()
返回字符数组类型char[] ,将字符串转化为字符数组
3>getBytes()
返回字节数组byte[] ,将字符串转为字节数组
4>toUpperCase()
返回String,将字符串中字母转成大写
5>toLowerCase()
返回String,将字符串中的字母转成小写
6>替换方法
a>replace(char oldchar,char newchar)
返回String,将字符串中的特定字符oldchar转换为新的字符newchar,如果字符串中不含有oldchar字符,那么返回的是原来的字符串。
b>replace( CharSequence target,CharSequence replacement)
使用指定的字符串替换原字符串中的子串,charSequence是一个接口,我们把他理解成String类型的字符串就可以了。
7>valueof(可以是基本数据类型,也可以是字符或者字符数组)
返回String,valueof()可以把基本数值类型或者字符、字符数组转成字符串。此类方法是String类的静态方法。
8>trim()
返回String,此方法可以将字符串中的前端后尾部空格去掉,此方法多用来删除用户不小心输入的空格。
4.比较
compareTo(String str)
返回值为int类型,用来对两个字符串进行字典顺序(ACSII码表)的比较。
如果字符串等于此字符串,返回0,注意只有当equals方法返回true时,此方法才返回0。
如果字符串按字典顺序小于字符串参数,返回负整数。
如果字符串按字典顺序大于字符串参数,返回正整数。
三. 字符串缓冲区——StringBuffer
StringBuffer我们可以把他看做一个容器,他可以接收不同类型的数据并将他们转换成字符串。
1.StringBuffer的特点
①他可以对字符串进行修改
②长度可变
③可以操作多种数据类型
④与String相似,拥有String类的大多数方法,可以通过toString()方法变成字符串。
2.StringBuffer的功能
(1)存储
1>append(数据)
Append()可以接收各种数据类型,除了byte和short,但是int可以替代两者,此类方法返回的还是本类对象,因为StringBuffer是可以被改变的,无需像String一样返回一个新的字符串。
2>inset(int offset,数据)
此方法依旧是在本类对象中修改,offset指定是在此位置插入后面的数据。
(2)删除
1>delete(int start,int end)
返回本类对象,删除从start到end-1位置上的字符(包头不包尾)。
2>deleteCharAt(int index)
返回本类对象,删除指定位置index上的字符。
(3)获取
1>substring(int start,int end)
返回的String类型,不是StringBuffer,依旧是截取从Strart到end-1这段字符串。
2>chatAt(int index)
返回字符类型,根据指定位置查找该位上的字符
3>indexOf(String str)
返回int类型,获取子串str在缓冲区中的起始位置
4>lastIndexOf(String str)
返回int类型,获取子串最后一次出现在缓冲区中的具体位置
(4)修改
1>replace(int start,int end,String str)
返回本类对象,将从start到end-1的这段字符串替换成str。
2>setCharAt(int index,char ch)
无返回值,将指定位置index上的元素替换为ch。
(5)反转
reverse()
返回本类对象,将缓冲区中的内容反转过来。
3. StringBuilder
StringBuilder可以看做是StringBuffer的简易替换,他们的功能一样用法一样。区别在于StringBuffer是线程同步的,而StringBuilder是线程不同步的。所以当我们的程序中只有一个线程时我们使用StringBuilder,这样效率高。
四. 基本数据类型包装类与字符串的转换
1.基本数据类型包装类的简介
我们知道基本数据类型有8种:byte、short、int、long、float、double、boolean、char。为了方便我们对这些基本数值类型进行操作,java把这8种基本数据类型分别封装成类。
byte基本数值类型 对应Byte类,short对应Short,也就是基本数值类型首字母大写就是其包装类的名,但是有两个特殊的,int对应Integer,char对应Character。
我们把基本数值类型转换为对象之后,我们就可以利用面向对象的方式来操作基本数据类型,例如我们可以获取一个int型数值的二进制表现形式,以前我们需要自己写方法来获取,现在我们在Integer中就已经定义好了此方法我们调用就可以了。
2.基本数据类型与字符串之间的转换
(1)基本数据类型转字符串
1> 基本数据类型+””
2>利用String类中的静态方法valueOf(基本数据类型值)
3>利用基本数据类型包装类中的方法toString()来获取其字符串表现形式。
(2)字符串转基本数据类型
1>在基本数据类型包装类中都有一个静态方法ParseXxx(String str)方法。比如Integer中有parseInt(String str)方法,这个方法返回值为int类型,Double中有parseDouble(String str)此方法返回值为double类型,也就是:
Integer.parseXxx(“xxx类型的字符串”)
注意点是在Character中没有此方法,因为字符串本就是字符组成的,所以不需要。
如果字符串被基本数据类型进行了对象的封装,那么我们可以用非静态的方法xxxvalue()来完成字符串转基本数据类型。例:
Boolean bl= new Boolean("true");
boolean x = bl.booleanValue();