String的两种创建方式:
1.String s1 = "abc"
首先去常量池找"abc",如果不存在,就在常量池创建"abc",然后在栈中开辟s1,存放"abc"的内存地址
2.String s2=new String("abc")
首先去常量池找"abc",如果不存在,就创建"abc",然后在堆中开辟空间存放String的一个对象,然后在栈中开辟s2,其中存放堆中String对象的内存地址
三者异同:
String底层:char[]
StringBuilder底层:char[]
StringBuffer底层:char[]
String追加会new一个新的String
StringBuffer和StringBuilder追加会判断是否超过容量,超过则会扩容(size*2+2,特殊:扩容过大时直接变为最终大小),初始容量为初始值长度+16。
StringBuffer和StringBuilder唯一区别:前者线程安全(牺牲了效率:方法使用了synchronized)