String這個常量在咱們代碼中會常常被用到,那麼咱們瞭解 String stringbuffer StringBudilder三者之間的區別嗎安全
String s1= "222"; //直接在常量池中開闢一個地址,若是有相同的則指向同一個地址 String s2=new String("223"); //直接在堆裏面新建一個
經過new關鍵字來生成對象是在堆區進行的,而在堆區進行對象生成的過程是不會去檢測該對象是否已經存在的。所以經過new來建立對象,建立出的必定是不一樣的對象,即便字符串的內容是相同的。多線程
public class Main { public static void main(String[] args) { String string = ""; for(int i=0;i<10000;i++){ string += "hello"; } } } public class Main { public static void main(String[] args) { StringBuilder stringBuilder = new StringBuilder(); for(int i=0;i<10000;i++){ stringBuilder.append("hello"); } } }
上面第一個是每次都會建立一個新地址用來存儲,因此會致使真個遍歷過程十分要建立不少次,而使用stringBuilder就只會建立一次,,大大節省時間和內存空間;app
StringBuilder:線程非安全的
StringBuffer:線程安全的
當咱們在字符串緩衝去被多個線程使用是,JVM不能保證StringBuilder的操做是安全的,雖然他的速度最快,可是能夠保證StringBuffer是能夠正確操做的。固然大多數狀況下就是咱們是在單線程下進行的操做,因此大多數狀況下是建議用StringBuilder而不用StringBuffer的,就是速度的緣由。ui