Java基础知识强化36:StringBuffer类之StringBuffer的概述
1. StringBuffer类概述:
(1)String的缺陷:
我们如果对字符串进行拼接操作,每次拼接,都会构造一个新的String对象,既耗时,又浪费空间。如下图:
(2)StringBuffer弥补了String的缺陷
为了改进这个问题,而StringBuffer就可以解决这个问题。
StringBuffer如何解决这个问题呢?
StringBuffe第一次开辟比默认字符串大16byte的空间,然后在这16个字节字节写入被拼接的串。
如果空间不够,以现有空间*2+2的方式翻一倍扩充。
StringBuffer开辟较大的空间,空间满时再放大一倍的空间
比如存储"hello"5个字符,会开辟char t[10]
前5个放"hello",后5个为拼接的字符。
如果拼接" my world" 9个字符超过t[10]
空间再翻倍,乘2变成t[20]
用t[20]存储hello my world
(3)StringBuffer的特点
StringBuffer是线程安全的可变字符串。
StringBuffer是用于存储数据的容器,StringBuffer长度是可变的,StringBuffer可以存储不同类型数据,StringBuffer最终要转成String进行使用,可以对字符串进行修改。
2. StringBuffer 和 String的区别?
答:前者长度和内容可变,后者不可变。
如果使用前者做字符串拼接,不会浪费太多的资源。
而且频繁使用字符串拼接时候,建议使用StringBuffer,StringBuffer效率比String高太多了。
看看String和StringBuffer连接字符串的性能究竟有多少差别,如下:
下面测试中String和StringBuffer都进行了10万次字符串拼接,谁强谁弱,我们拭目以待:
package com.himi.test; public class TestDemo { public static void main(String[] args) { System.out.println("----String测试----"); System.out.println("开始时间:" + System.currentTimeMillis()); String str1 = "a"; for (int i = 0; i < 100000; i++) { str1 += "b"; } System.out.println("结束时间:" + System.currentTimeMillis()); System.out.println("----StringBuffer测试----"); System.out.println("开始时间:"+System.currentTimeMillis()); StringBuffer str2 = new StringBuffer("a"); for(int i=0;i<100000;i++){ str2.append("b"); } System.out.println("结束时间:"+System.currentTimeMillis()); } }
测试结果,如下: