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