84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
字符串类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" 对象