String | StringBuffer | StringBuilder |
JDK1.0 | JDK5.0 | |
字符串常量,内容不可变 | 字符串变量,线程安全 | 字符串变量,线程不安全 |
发生改变时,一般是生成一个新的String对象,然后指针指向这个新的对象,所以内容经常改变的对象最好不要用String,因为每次生成新对象的时候,都会对系统的性能会产生影响,尤其是当内存中无引用对象多了之后,jvm的GC垃圾处理机制就会开始运行,从而导致性能下降 | 由于线程安全,一般用于全局变量,操作一般分为append和insert | 由于线程不安全,一般用于方法内或者确认的单线程中使用,操作一般有append和insert |
操作少量的数据,用string | 多线程操作大量数据,用stringbuffer | 单线程操作大量数据,用stringbuilder |
不要用string进行+的操作 | 使用时最好能指定他们的容量(默认是16个字符串),在不确定模块是单线程还是多线程的时候,最好使用StringBuffer | |
执行速度快 | 相比于StringBuffer性能提升了10%~15% |
// 在定义字符串的时候,进行➕的操作效率很快
String s1 = “This is only a” + “ simple” + “ test”;// java complier会自动编译成 String s1 = “This is only a simple test”;
⬇️执行效率大于StringBuffer
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
// 不要新建String对象,再进行➕的操作
String s2 = “This is only a”;
String s3 = “ simple”;
String s4 = “ test”;
String s1 = s2 + s3 + s4;
String result = "";
for (String s : hugeArray) {
result = result + s;
}
// 使用StringBuilder
StringBuilder sb = new StringBuilder();
for (String s : hugeArray) {
sb.append(s);
}
String result = sb.toString();
// 在进行循环的时候,第一种方法每次遍历都会生成一个新的String对象,所以很消耗性能,