为了账号安全,请及时绑定邮箱和手机立即绑定

字符串类StringBuffer和StringBuilder叫字符串缓冲区,请问哪里体现缓冲了?

字符串类StringBuffer和StringBuilder叫字符串缓冲区,请问哪里体现缓冲了?

繁花不似锦 2019-02-19 19:56:32
字符串类StringBuffer和StringBuilder叫字符串缓冲区,请问哪里体现缓冲了?
查看完整描述

4 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

由于Java的String都是以定长的方式存储在内存中的,所以所有对String的增删改操作,都需要创建新的内存并进行内存复制。

StringBuffer和StringBuilder的处理方式则与普通的String增删改有所不同,它们是先申请内存,从而避免频繁的内存申请。

比如我们分别拼接"a","b","c"。如果通过"a" + "b" + "c"这种方式,(在没有优化的情况下)Java会先申请一个两字节的内存,将"a"和"b"复制到这个内存上,之后再申请一个三字节的内存,将"ab"和"c"复制到这块内存中。
而通过StringBuffer或者StringBuilder,他们会先申请一块大内存(默认是十六字节),当我们拼接时,只需要直接复制"a","b","c"到这块内存上即可,不需要反复申请内存了。这里先申请后使用的形式就体现了缓冲区的概念。

查看完整回答
反对 回复 2019-03-01
?
SMILET

TA贡献1796条经验 获得超4个赞

不生成新对象。用String每次+都会产生新对象,当然较短时编译器会进行编译优化,而buffer这直接在原对象上append,不会产生新对象

查看完整回答
反对 回复 2019-03-01
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

这里以StringBuilder为例,你看下源码,StringBuilder内部的存储是采用char数组实现存储的,append时,会将后面的字符串拷贝到StringBuilder内部的char数组,如果内部缓冲不足,会用到System.arrayCopy来实现一个扩容机制,很高效。就是这样实现的缓冲。

而String d = "a" + "b" + "c"; 这种会产生多个字符串对象,像上面回答的那样,原因在于虚拟机内部存在一个字符串缓冲池。

查看完整回答
反对 回复 2019-03-01
  • 4 回答
  • 0 关注
  • 530 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信