String、StringBuilder和StringBuffer
1、String
String内容是不可变的字符,String底层使用了一个不可变的字符数组(final char[])
private final char value[];String进行拼接 :
//在此创建了三个对象
String str = "a"+"b";String 定义的字符串保存在常量池里面,进行+操作时不能直接在原有基础上拼接。每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。
Java6和6之前,常量池是存放在方法区中的。
Java7,将常量池是存放到了堆中,常量池就相当于是在永久代中,所以永久代存放在堆中。
Java8之后,取消了整个永久代区域,取而代之的是元空间。没有再对常量池进行调整。
2、StringBuilder
StringBuilder底层是可变的字符数组。是线程不安全,效率高。
StringBuilder进行高效的字符串拼接:
StringBuilder sb = new StringBuilder();
//仍然还是原来的对象,不会创建新的StringBuilder对象
sb.append("a").append("b");3、StringBuffer
StringBuffer底层是可变的字符数组。是线程安全的,效率低。
与StringBuilder相比,内部的大量方法都加了synchronized关键字加锁同步。

4、比较
速度:
StringBuilder > StringBuffer > String
String最慢,因为每次都要重新开辟内存,产生很多匿名对象,影响系统性能。
使用:
(1)单线程下如果要操作少量的数据用 String
(2)单线程操作字符串缓冲区下操作大量数据 StringBuilder
(3)多线程操作字符串缓冲区下操作大量数据 StringBuffer


