字符串类StringBuffer和StringBuilder叫字符串缓冲区,请问哪里体现缓冲了?
学习是最好的投资!
由于Java的String都是以定长的方式存储在内存中的,所以所有对String的增删改操作,都需要创建新的内存并进行内存复制。
StringBuffer和StringBuilder的处理方式则与普通的String增删改有所不同,它们是先申请内存,从而避免频繁的内存申请。
比如我们分别拼接"a","b","c"。如果通过"a" + "b" + "c"这种方式,(在没有优化的情况下)Java会先申请一个两字节的内存,将"a"和"b"复制到这个内存上,之后再申请一个三字节的内存,将"ab"和"c"复制到这块内存中。而通过StringBuffer或者StringBuilder,他们会先申请一块大内存(默认是十六字节),当我们拼接时,只需要直接复制"a","b","c"到这块内存上即可,不需要反复申请内存了。这里先申请后使用的形式就体现了缓冲区的概念。
不生成新对象。用String每次+都会产生新对象,当然较短时编译器会进行编译优化,而buffer这直接在原对象上append,不会产生新对象
这里以StringBuilder为例,你看下源码,StringBuilder内部的存储是采用char数组实现存储的,append时,会将后面的字符串拷贝到StringBuilder内部的char数组,如果内部缓冲不足,会用到System.arrayCopy来实现一个扩容机制,很高效。就是这样实现的缓冲。
而String d = "a" + "b" + "c"; 这种会产生多个字符串对象,像上面回答的那样,原因在于虚拟机内部存在一个字符串缓冲池。
普通的 "a" + "b" +"c"
是会产生 "ab" string 对象的
但是用那两个类只会生成最后的一个 "abc" 对象
由于Java的String都是以定长的方式存储在内存中的,所以所有对String的增删改操作,都需要创建新的内存并进行内存复制。
StringBuffer和StringBuilder的处理方式则与普通的String增删改有所不同,它们是先申请内存,从而避免频繁的内存申请。
比如我们分别拼接"a","b","c"。如果通过"a" + "b" + "c"这种方式,(在没有优化的情况下)Java会先申请一个两字节的内存,将"a"和"b"复制到这个内存上,之后再申请一个三字节的内存,将"ab"和"c"复制到这块内存中。
而通过StringBuffer或者StringBuilder,他们会先申请一块大内存(默认是十六字节),当我们拼接时,只需要直接复制"a","b","c"到这块内存上即可,不需要反复申请内存了。这里先申请后使用的形式就体现了缓冲区的概念。
不生成新对象。用String每次+都会产生新对象,当然较短时编译器会进行编译优化,而buffer这直接在原对象上append,不会产生新对象
这里以StringBuilder为例,你看下源码,StringBuilder内部的存储是采用char数组实现存储的,append时,会将后面的字符串拷贝到StringBuilder内部的char数组,如果内部缓冲不足,会用到System.arrayCopy来实现一个扩容机制,很高效。就是这样实现的缓冲。
而String d = "a" + "b" + "c"; 这种会产生多个字符串对象,像上面回答的那样,原因在于虚拟机内部存在一个字符串缓冲池。
普通的 "a" + "b" +"c"
是会产生 "ab" string 对象的
但是用那两个类只会生成最后的一个 "abc" 对象