猿问

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

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

繁花不似锦
浏览 531回答 4
4回答

Cats萌萌

由于Java的String都是以定长的方式存储在内存中的,所以所有对String的增删改操作,都需要创建新的内存并进行内存复制。 StringBuffer和StringBuilder的处理方式则与普通的String增删改有所不同,它们是先申请内存,从而避免频繁的内存申请。 比如我们分别拼接"a","b","c"。如果通过"a" + "b" + "c"这种方式,(在没有优化的情况下)Java会先申请一个两字节的内存,将"a"和"b"复制到这个内存上,之后再申请一个三字节的内存,将"ab"和"c"复制到这块内存中。而通过StringBuffer或者StringBuilder,他们会先申请一块大内存(默认是十六字节),当我们拼接时,只需要直接复制"a","b","c"到这块内存上即可,不需要反复申请内存了。这里先申请后使用的形式就体现了缓冲区的概念。

SMILET

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

慕雪6442864

这里以StringBuilder为例,你看下源码,StringBuilder内部的存储是采用char数组实现存储的,append时,会将后面的字符串拷贝到StringBuilder内部的char数组,如果内部缓冲不足,会用到System.arrayCopy来实现一个扩容机制,很高效。就是这样实现的缓冲。 而String d = "a" + "b" + "c"; 这种会产生多个字符串对象,像上面回答的那样,原因在于虚拟机内部存在一个字符串缓冲池。
随时随地看视频慕课网APP

相关分类

Java
我要回答