本文参考了http://wenku.baidu.com/view/8de1a06b011ca300a6c390d2.html
1.String类的对象
a.一旦创建就不能改变。
b.如果把一个引用的对象赋一个新值,只是将新的引用指向了一个新的对象,旧的对象依然没有变。(也就是每次赋一个新值都创建了新的对象)
2.StringBuffer, StringBuilder:
a.对象的内容是可以修改的,每次操作都会对对象本身进行操作,而不是生成新的对象。
3.下面是一个类的测试
package com.jue.test;
public class MainTest {
public static void main(String[] args) {
test1();// 1685
test2();// 12
}
private static void test1() {
long startTime = System.currentTimeMillis();
String s = "abc";
for (int i = 0; i < 10000; i++) {
s += "123";
}
long currentTime = System.currentTimeMillis();
System.out.println(currentTime - startTime);
}
private static void test2() {
long startTime = System.currentTimeMillis();
StringBuffer s = new StringBuffer("abc");
for (int i = 0; i < 10000; i++) {
s.append("123");
}
long currentTime = System.currentTimeMillis();
System.out.println(currentTime - startTime);
}
}
结果
test1:1685
test2:12
4.对于某些情况,直接相加快于StringBuffer
private static void test3() {
long startTime = System.currentTimeMillis();
StringBuilder s = new StringBuilder("abc");
for (int i = 0; i < 10000000; i++) {
s.append("123");
}
long currentTime = System.currentTimeMillis();
System.out.println(currentTime - startTime);
}
private static void test4() {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
String s1 = "123" + "456" + "789" + "abc" + "def";
}
long currentTime = System.currentTimeMillis();
System.out.println(currentTime - startTime);
}
结果:
test3: 0~1
test4: 80~90
5.StringBuffer 与StringBuilderStringBuffer是线程安全的。
StringBuilder是非线程安全的,如果不会有线程的逃逸,使用StringBuilder更好。