String类详解

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在实际项目中用的范围更多,缺点是浪费空间(每一个字符串都需要在方法区字符串常量池创建)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero摄氏度

感谢鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值