定义
String:字符串常量
StringBuffer:字符串变量
StringBuilder:字符串变量
String是“字符串常量”,也就是不可改变的对象。如果用String来处理字符串的变化时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多低,所以String主要用来处理字符串常量。
StringBuffer与StringBuilder是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度和效率就快。
样例分析
先来个测试样例:
String string = "";
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
string = string + i;
}
long end = System.currentTimeMillis();
System.out.println("string time:"+(end-start));
StringBuffer stringBuffer = new StringBuffer();
long start_stringBuffer = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
stringBuffer = stringBuffer.append(i);
}
long end_stringBuffer = System.currentTimeMillis();
System.out.println("stringBuffer time:"+(end_stringBuffer-start_stringBuffer));
StringBuilder stringBuilder = new StringBuilder();
long start_stringBuilder = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
stringBuilder = stringBuilder.append(i);
}
long end_stringBuilder = System.currentTimeMillis();
System.out.println("stringBuilder time:"+(end_stringBuilder-start_stringBuilder));
运行结果:
string time:16820
stringBuffer time:6
stringBuilder time:4
运行结果清楚的告诉我们,处理字符串变化时的速度和效率是:
StringBuilder > StringBuffer > String
StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们的字符串被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。
当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
总结
1.如果要操作少量的数据用 String
2.单线程字符串操作大量数据 = StringBuilder
3.多线程字符串操作大量数据 = StringBuffer