StringBuilder
如果你想在toString()方法中使用循环,那么最好创建一个新的StringBuilder对象
public class UsingStringBuilder {public static Random rand = new Random(47);public String toString(){StringBuilder result = new StringBuilder("[");for (int i = 0; i <10 ; i++) {result.append(rand.nextInt(100));result.append(",");}result.append("]");return result.toString();}public static void main(String[] args) {UsingStringBuilder usb = new UsingStringBuilder();System.out.println(usb);}}输出:[58,55,93,61,61,29,68,0,22,7,]
Java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串。
String s = "";for (int i = 0; i < 1000; i++) {s = s + "," + i;}
虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。
为了能高效拼接字符串,Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象:
StringBuilder sb = new StringBuilder(1024);for (int i = 0; i < 1000; i++) {sb.append(',');sb.append(i);}String s = sb.toString();
StringBuilder还可以进行链式操作
public class Main {public static void main(String[] args) {var sb = new StringBuilder(1024);sb.append("Mr ").append("Bob").append("!").insert(0, "Hello, ");System.out.println(sb.toString());}}Hello, Mr Bob!
StringBuffer
你可能还听说过StringBuffer,这是Java早期的一个StringBuilder的线程安全版本,它通过同步来保证多个线程操作StringBuffer也是安全的,但是同步会带来执行速度的下降。
StringBuilder和StringBuffer接口完全相同,现在完全没有必要使用StringBuffer。
