因为Java字符串是不可变的,每一次拼接都会产生新的字符串,这样会占用大量的方法区内存,造成内存空间的浪费。
String s = "abc";
s += "hello";
//以上两行代码就导致在方法区字符串常量池中创建了3个对象
//"abc" "hello" "abchello"
如果以后需要大量字符串拼接的工作,建议使用StringBuffer、StringBuilder。
StringBuffer 称为字符串缓冲区,它的工作原理是:预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。StringBuffer 是可变对象, 这个是 String 最大的不同。
//创建一个初始化容量为16的byte[]数组,字符串缓冲区
StringBuffer strb = new StringBuffer();
//拼接字符串调用append()方法
strb.append("h");
strb.append("e");
strb.append("l");
strb.append("l");
strb.append("o");
System.out.println(strb);//hello
StringBuilder()
//创建一个初始化容量为16的byte[]数组,字符串缓冲区
StringBuffer strb = new StringBuffer();
//拼接字符串调用append()方法
strb.append("h");
strb.append("e");
strb.append("l");
strb.append("l");
strb.append("o");
System.out.println(strb);//hello
用法同 StringBuffer,StringBuilder 和 StringBuffer 的区别是 StringBuffer 中所有的方法都是同步的,是线程安全的,但速度慢,StringBuilder 的速度快,但不是线程安全的。