关于StringBuffer类(学习笔记)
在我们实际开发当中,也许会遇到需要我们频繁拼接字符串的时候,这个时候我们应该怎么办呢?
在Java中,字符串是不可变的,每一次的拼接都会产生新的字符串,这样会占用大量的方法区内存,造成内存空间的浪费,如下:
String s = "Hello";
s += "World";
就以上两行代码,就会创建三个字符串对象,
“Hello”
“World"
"HelloWorld"
为了避免以上的情况,我们需要用到我们的StringBuffer类。
StringBuffer
-
StringBuffer底层是一个byte[ ] 数组,他的初始容量默认是16(一个字符串缓冲区对象),当我们需要拼接字符串的时候,我们可以调用StringBuffer的append()方法,append是追加的意思。他会帮我们把需要的字符串拼接起来而不会在字符串常量池中创建新对象,从而节省了大量的方法区内存。如下:
如果我们在进行append()追加的时候,底层的byte[ ]数组满了,他会自动扩容。但是频繁的进行数组扩容会影响程序的执行效率,所以我们可以对StringBuffer的性能进行优化。 -
如何优化StringBuffer的性能?
在创建StringBuffer对象的时候预估下自己需要的字符串长度,尽可能的给定一个初始化容量,减少底层数组的扩容次数。
StringBuffer stringBuffer = new StringBuffer(100);
这样底层的byte[ ]数组的容量就是100了。
但是也不要给定太大的容量,同样会造成内存的浪费。
-
StringBuffer和StringBuilder的区别
StringBuffer的方法都有:synchronized关键字修饰。表示StringBuffer在多线程环境下运行是安全的。
StringBuilder中的方法都没有:synchronized关键字的修饰,表示StringBuilder在多线程环境下运行是不安全的。StringBuffer是线程安全的。
StringBuilder是非线程安全的。