String、StringBuilder、StringBuffer
http://www.cnblogs.com/dolphin0520/p/3778589.html
附上同行写的博客,写的不错
我学习了,总结如下:
1.查看源码
private final char value[],发现字符串中每一个字符实际上是以数组的形式保存着的
查看concat,replace等很多方法,返回结果都是return new String(xxx),都是重新生成新的字符串对象,而不是在原字符串上操作
记住对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
2.博主反编译字节码文件,这个不会
String string = "";
for(int i=0;i<10000;i++){
string += "hello";
}
这段代码如果直接执行实际上产生了1000个String对象
但在运行中实际上jvm使用StringBuilder去优化
StringBuilder str = new StringBuilder(string);
str.append("xxx");
str.toString();
首先生成StringBuilder对象,用StringBuilder对象去操作(append),然后将StringBuilder转换为String
这样同样会产生1000个对象
这样有优化效果吗,我测试了一下是能优化的,速度快的时候能提高一倍
3.下面介绍StringBuilder与StringBuffer
上面的操作如果使用StringBuilder:
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i<10000;i++){
stringBuilder.append("hello");
}
则只会产生一个stringBuilder 对象,也就是说在用stringBuilder 操作时候,不会产生新的对象,这样大大提升了速度
所以,如果字符串的相加操作或者改动操作过多的话,就使用stringBuilder
StringBuffer是干什么的呢?
看源码,发现几乎是一样的,就是在成员方法上多了synchronized,显然就表明它是线程安全的
在多线程环境,使用StringBuffer