String&StringBuider&StringBuffer的區別

前言

很多初學者都不知道這三者之間的區別,我們今天一起來看一下。

String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,這樣不僅效率低下,而且大量浪費有限的內存空間

StringBuilderStringBuffer是可變的,但StringBuilder多線程是不安全的,StringBuffer多線程是安全的。

String使用陷阱

String s="a";//創建了一個字符串
​
s=s+"b";
//實際上原來的“a”字符串對象已經丟了,現在又產生了一個字符串s+"b"(也就是ab),如果多次執行這些,改變字符串的內容,會導致大量副本字符串對象存留在內存中,降低效率。如果這樣的數據放在循環中會大大降低效率,影響程序的性能。

初始化上的區別,String可以空賦值,後者不行,報錯

①String

String s = null;

String s = “abc”;

②StringBuffer

StringBuffer s = null; //結果警告:Null pointer access: The variable result can only be null at this location

StringBuffer s = new StringBuffer();//StringBuffer對象是一個空的對象

StringBuffer s = new StringBuffer(“abc”);//創建帶有內容的StringBuffer對象,對象的內容就是字符串”

String&StringBuider的效率問題

例:

String str="I"+"love"+"you";
//它應當先創建一個對象複製後合成"Ilove",然後再創建一個新的對象將兩部分內容複製合成"Iloveyou",可見效率極低,但是由於string不可變,因此它本身不存在多線程的安全問題。
//實際上,java編輯器作者考慮到這個問題,在當你使用以上語句的時候,編輯器會自動引入java.lang.StringBuilder
//StringBuilder對象能夠被多次的修改,並且不產生新的未使用對象

因此:我們知道在一般情況下兩者是沒有區別的,但是如果創建的字符串對象是在for循環內做“+”,區別就會顯現。

package springBuilder;
​
import org.junit.jupiter.api.Test;
​
public class SpringTest { 
 @Test
 public void testString() {
 
 String str = "";
 for (int i = 0; i < 3; i++) {
 str += i;
 }
 System.out.println(str);
 }
 
 @Test
 public void testStringBuilder() {
 StringBuilder builder = new StringBuilder();
 for (int i = 0; i < 3; i++) {
 builder.append(i);//相當於builder=+i;
 }
 System.out.println(builder.toString());
 }
​
}
​

通過以上例子我們明顯可以看到兩者的效率高低:

String運行結果:

String&StringBuider&StringBuffer的區別

StringBuilder運行結果:

String&StringBuider&StringBuffer的區別

三者之間的關係

String&StringBuider&StringBuffer的區別

小結

(1)如果要操作少量的數據用 String。

(2)多線程操作字符串緩衝區下操作大量數據 StringBuffer。

(3)單線程操作字符串緩衝區下操作大量數據 StringBuilder。


分享到:


相關文章: