对比面试题--String,StringBffer ,StringBuilder区别

String StringBuffer StringBuilder的共同点

  • 都是用于处理字符串数据的类
  • 都是管理内部的一个char[ ]实现的
  • 实现的接口大致相同,特别是CharSequence接口
  • 许多API的设计中,方法的参数或返回值都使用这个接口,使得参数或返回值更加灵活
  • 有许多相同的API,例如replace() indexOf()等

String:

首先,我们的得知道String的“不可变”特性:每个字符串对象都是不可变的

String s="hello";
s="hello,world!";

以上代码中,声明了1个变量,创建里2个对象(hello本身是没有变的)

String的“不可变“特性是由其内部通过管理一个char[ ]决定的

在java语言中,数组在内存必须是连接的,则其长度不可变

提示:String 的“不可变“”特性与该类的中的final无关

提示:因为String的“不可变”特性,在String的API中,所有修改的字符串都将返回新的String对象

基于String的不可变特性,String的修改操作的效率将非常低下

需寻址、创建对象,还可能将原有char[ ]的某部分复制到新的char[ ] 中

String s="hello";
s+="!";//hello!

 基于String的效率低下(遐想几个朋友吃饭,正好遇见里另一个朋友,想让他加入饭局,可是桌子只有那么大,还得转桌),这时StringBuffer,StringBUilfer方法(找一个包房,虽然浪费,但问题解决了)

StringBuffer和StrigBuilder从一开始就会使用长度更长的char[ ],哪怕只用于存放少量的几个字符

其length()方法会返回实际存放的字符数量

 StringBuffer的构造方法:

 我们可以从他的注释上看出,它是创建里一个StringBuffer的对象,并且的里面没有任何的字符,同时他的默认初始大小是16个字符

当然我们也可以运用下面,往里面放入一个int符,然后直接指定要放入的多少个

 StringBuffer的扩容:

 我们可以得知StringBuffer其实和String一样,它也会需要去找新的地方,然后创建的对象把数据把数据给搬过去,也需要经历这样的过程,但是由于他每次都需要扩容,并且一扩就一倍,所以导致它搬家加寻址这个操作的频率变得更低,很多要操控数据的时候,直接在自身的基础上操作就可以了。所以使得它的效率会变得更高

      在许多调整字符串的操作中,StringBuffer和StringBuilder只需要直接调整内部的char[ ]即可,不需要频繁的寻址,创建新队象等操作,所以,实际执行效率远高于String类

   当然,如果默认的char[ ]长度(实际长度)不足以满足运算需求时u,会自动扩容,也需要创建新的对象

 

 

 至于StringBuffer和StringBuilder用哪个呢:

StringBuffer是线程安全的,而StringBuilder类的不是

 小结:

相同之处:

  • 都是用于处理字符串的类
  • 都是管理内部的一个char[ ]实现的
  • 实现的接口大致相同,特使是CharSequence接口
  • 有许多相同的API,列如:replace(),indexOf()等

 不同之处:

  • String的字符串操作效率低下,是因为它的“不可变”特性决定的
  • StringBuffer和StringBuilder会保证管理的char[ ]的长度始终高于实际存入的字符长度,在处理字符串操作时效率远高于String
  • StringBuffer是线程安全的,而StringBuilder不是

 实际使用原则:

      尽管StringBuffer和StringBuilder在处理字符串时的效率远高于String,但并不是每个Strng都需要频繁的改变,相比之下,使用String的语法更加简洁,直观,实际占用的存储空间更小,所以,当字符串不需要频繁的改变时,优先使用String。如果字符串需要频繁改变,原则上说仅当单线程运行时,或已经采取措施保障线程安全时,优先使用Strilder,因为的执行效率高于StrngBuffer,事实上,尽管StringBuilder的执行效率比StringBuffer高,但差距并不大,为例避免后续调整带来的隐患,当字符串可能频繁改变时,一般使用StringBuffer。(优先使用StringBuffer的原因,项目交替,老程序员离职等因素,我们需要接手时,从安全的角度出发,优先使用安全性高的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Liamlf

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值