搜索

首页  >  问答  >  正文

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

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

PHPzPHPz2918 天前671

全部回复(4)我来回复

  • 高洛峰

    高洛峰2017-04-18 10:33:19

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

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

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

    回复
    0
  • 黄舟

    黄舟2017-04-18 10:33:19

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

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:33:19

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

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

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:33:19

    普通的 "a" + "b" +"c"

    是会产生 "ab" string 对象的

    但是用那两个类只会生成最后的一个 "abc" 对象

    回复
    0
  • 取消回复