一、String、StringBuilder、StringBuffer的差異
首先需要知道的是,String、StringBuilder和StringBuffer都是Java中處理字符串的類,但是它們之間還是存在一些差異的。
String是不可變的對象,一旦創建就不能被修改。每次對字符串進行修改時,實際上都是創建了一個新的String對象。這樣會導致頻繁地創建對象,浪費內存。
StringBuilder和StringBuffer都是可變的字符串對象,每次對字符串進行修改時,都是在原有的對象上進行修改,而不是創建一個新的對象。因此,它們比String效率更高。
String str = "hello"; str += " world"; System.out.println(str); // 輸出hello world StringBuilder sb = new StringBuilder("hello"); sb.append(" world"); System.out.println(sb.toString()); // 輸出hello world StringBuffer sbf = new StringBuffer("hello"); sbf.append(" world"); System.out.println(sbf.toString()); // 輸出hello world
二、線程安全性的差異
String和StringBuilder是不安全的,而StringBuffer是安全的。
String是不可變的,因此不存在線程安全問題。
StringBuilder是非線程安全的。如果多個線程同時對同一個StringBuilder對象進行操作,可能會導致數據不一致。
StringBuffer是線程安全的,底層的方法被synchronized修飾,保證了線程安全。
// StringBuilder的線程不安全 StringBuilder sb = new StringBuilder(); for (int i = 0; i { sb.append("a"); System.out.println(sb.toString()); // 可能出現a、aa、aaa等多種情況 }).start(); } // StringBuffer的線程安全 StringBuffer sbf = new StringBuffer(); for (int i = 0; i { sbf.append("a"); System.out.println(sbf.toString()); // 一定是一串a }).start(); }
三、性能的差異
StringBuilder比StringBuffer性能更好。
雖然StringBuffer是線程安全的,但是synchronized關鍵字會影響性能。而StringBuilder是非線程安全的,但是沒有線程安全的開銷,因此StringBuilder的性能比StringBuffer更好。
long startTime = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 100000; i++) { sb.append(i); } System.out.println(System.currentTimeMillis() - startTime + "ms"); // 輸出9ms startTime = System.currentTimeMillis(); StringBuffer sbf = new StringBuffer(); for (int i = 0; i < 100000; i++) { sbf.append(i); } System.out.println(System.currentTimeMillis() - startTime + "ms"); // 輸出16ms
四、結論
String、StringBuilder和StringBuffer都是用來處理字符串的類,但是它們之間還是存在一些差異的。
如果在單線程環境下處理字符串,建議使用StringBuilder,因為它沒有線程安全的開銷。
如果在多線程環境下處理字符串,建議使用StringBuffer,因為它是線程安全的。
如果不需要修改字符串,建議使用String。
原創文章,作者:GLOKM,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/316918.html