String类
1.1、String类
1、String类是final类型,因此不能被继承;
2、String对象代表一组不可改变的Unicode字符序列。任何试图改变String对象的方法都会创建一个新的字符串对象。
为什么不可改变?
//String类源码
private fianl char value[];
- Final修饰value数组,类使用fianl修饰,不可被继承,所以不能通过子类去重写父类
- private修饰,私有的,说明value不能向外暴露,没有暴露成员变量,外部不能修改value值
- String类内部也没有修改value的方法
综上,String类是不可改变的。字符串一旦创建就不可能再改变。
- 改变String类----创建一个新的String对象
不可改变的好处:
线程安全,提升性能
3、String对象的创建
- 当用这种方式:String s = “xxxxxx”;
说明:程序会在字符串常量池中去搜索该字符串,如果没有找到就在字符串常量池创建一个该字符串对象,可被共享。如果找到就直接拿来用
- 当用这种方式:String s = new String(“xxxxx”);
程序会创建两个字符串:在堆区创建一个字符串对象,在方法区字符串常量池创建一个字符串对象(同理会先在在常量池搜索该字符串,如果没有就创建,有的话不用创建)。
//例题
String s1 = "abc";//常量池创建
String s2 = "abc";//不用创建
String s3 = new String("abc");//堆里创建,常量池不用已经有了
String s4 = new String("abc");//堆里创建,常量池不用已经有了。
//问:程序会创建几个字符串对象?
//答:3个。s1==s2,s3!=s4
3、String类的构造方法
- String():创建一个内容为空的字符串对象(空串);
- String(String value):按字符串参数创建字符串对象;
- String(char[]value):按字符数组参数创建字符串对象;
- String(byte[]value):根据本地平台默认的字符编码,按字节数组参数创建字符串对象;
- String(byte[]value,String charsetName):根据charsetName指定的字符编码,按字节数组创建字符串对象;
4、String类重写了父类Object
- toString()
- equals()
- hashcode()
关于String重写父类中的equals()方法:
equals()方法在父类Object类中相当于“==”,判断两个对象的地址相等。但在String类对equals方法进行了重写,只要字符串内容一样就是相等
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s2.equals(s3));//true
//即便s2并不==s3(地址不同),但是因为String类重写了equals()方法,只要字符串内容一样就相等
equals相同hashcode一定相同,但是hashcode相同不一定equals相同
5、String类的常用方法
截取子串
substring(1,9):(begin,end-1) 包含左边不包含右边。从索引为1开始截取到索引为9的前一位
substring(1):从下标为1开始截取子串
检索指定字符串
indexof(“a”,2):从第二个字符开始,返回“a”出现的位置的下标
lastIndexof(“a”,2):从第二个字符开始往前找,返回“a”出现的位置的下标
匹配指定的字符串
a.endsWith(“.java”):预测此字符串是否以指定的后缀结束 返回true或false
a.startsWith(“aa”):预测此字符串是否以aa开头 返回true或false
比较字符
equals:区分大小写
equalsIgnoreCase:不区分大小写
compareTo:按字典顺序比较
其他
charAt:返回指定位置的字符
length():返回字符串的长度
toString():显示字符串
1.2、StringBuffer类
6、StringBuffer
- StringBuffer对象代表一组可改变的Unicode字符序列。
- StringBuffer对象和String对象不能比较,是不同类型
StringBuffer类构造器
- StringBuffer()创建一个空的字符缓冲,长度为16个字符容量;
- StringBuffer(int capacity):用指定的初始容量创建一个空的字符缓冲;
- StringBuffer(String initString)创建包含initString的字符缓冲,并加上16个字符的备用空间
StringBuffer类和String类的比较
相同点:
- 都是用来处理字符串;
- 都提供了length(),charAt(),subString()方法,并且用法相同;
不同点:
- StringBuffer类对象可变,改变其缓冲区的方法不会创建新对象,如果空间不够可自动扩容;而String类对象是不可变的;
- StringBuffer类没有覆盖equals方法,而String类覆盖了
- StringBuffer类不支持“+”运算,但是String支持“+”运算符连接字符串
- StringBuffer类覆盖了toString()方法,但和String类覆盖toString()方法的实现方式不同
StringBuffer sb = new StringBuffer("abc");
String s = "abc";
System.out.println(sb==s);//程序报错,两种不同类型不能比较
System.out.println(s==sb.equals())//true
//StringBuffer重写了toString()方法:它会创建一个String对象并将值设到String对象里并返回String对象的地址。因此,在这里比较 字符串s和sb.equals(),是相等的。
- String在实际项目中用的范围更多,缺点是浪费空间(每一个字符串都需要在方法区字符串常量池创建)