Java 中操作字符串的类有三个,分别是:String、StringBuffer(线程安全)、StringBuilder(非线程安全)。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String,而选择使用 StringBuffer 或 StringBuilder 类。例如:
public class Demo {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder();
for(int i = 0; i < 10; i++) {
if(builder.length() > 0) {
builder.append(",");
}
builder.append("i=").append(i);
}
System.out.println(builder.toString());
}
}运行示例,输出如下:
i=0,i=1,i=2,i=3,i=4,i=5,i=6,i=7,i=8,i=9
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。下面将简单测试 StringBuilder 和 StringBuffer 的性能,代码如下:
public class Demo {
public static void main(String[] args) {
int n = 100000;
stringBuffer(n);
stringBuilder(n);
}
private static void stringBuilder(int n) {
long start = System.currentTimeMillis();
StringBuilder builder = new StringBuilder();
for(int i = 0; i < n; i++) {
builder.append("i=").append(i);
}
System.out.println("StringBuilder " + (System.currentTimeMillis() - start) + "ms");
}
private static void stringBuffer(int n) {
long start = System.currentTimeMillis();
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < n; i++) {
buffer.append("i=").append(i);
}
System.out.println("StringBuffer " + (System.currentTimeMillis() - start) + "ms");
}
}运行示例,输出如下:
StringBuffer 38ms StringBuilder 20ms