Java之操作字符串的类String、StringBuffer、StringBuilder

1. 字符串类

Java中,操作字符串的类有:String、StringBuffer、StringBuilder

1.1 String与StringBuffer、StringBuilder区别

  • String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String(效率低,耗时长,浪费内存)。
  • StringBuffer : 对字符串操作的方法都加了synchronized,保证线程安全。
  • StringBuilder : 不保证线程安全。

1.2 效率比较

在效率上:StringBuilder>StringBuffer>String

原因:StringBuffer有同步锁,执行速度较StringBuilder慢,可以保证线程安全,适合多线程操作字符串;StringBuilder无同步锁,执行速度更快,不保证线程安全,适合单线程操作字符串;StringBuffer和StringBuilder是"字符串变量",而String是"字符串常量",也就是不可改变的对象,对其进行字符串操作,这个过程是需要重新在栈堆内存中开辟新的内存空间的,所以效率低,浪费内存。

 

 

2. String与new String()的区别​

JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间——字符串实例池。

String赋值的两种方式。

1、String a = "zl";

以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"zl"这个对象,如果存在,直接把实例池中"zl"的地址返回给a。如果不存在,则会在实例池中创建"zl"对象,并把该对象的地址返回给a,即a存的是"zl"对象的地址。

String a = "zl";//此时实例池中不存在“zl”这个对象,所以会在实例池中创建"zl"对象,并把该对象的地址返回给a,即a存的是"zl"对象的地址。
String b = "zl";//此时实例池中存在“zl”这个对象,所以会直接把实例池中"zl"的地址返回给b。所以a,b指向的是同一地址,所以返回true;​​​​​​

2、String a= new String("zl");

以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"zl"这个对象,若不存在则会在实例池中创建"zl"对象,同时在堆中创建"zl"这个对象,然后将堆中的这个对象的地址返回给a。若实例池存在则直接在堆中再创建一个"zl"这个对象,然后将堆中这个新创建对象的地址返回给a。

 String a = new Sring("zl");//此时在实例池和堆中均创建了“zl”这个对象,并且将堆中的这个对象的地址返回给a。
 String b = new Sring("zl");//此时实例池中已有“zl”这个对象,则直接在堆中创建“zl”这个对象,并将堆中的这个对象的地址返回给b。所以a和b存的是不同的内存地址,所以返回false;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值