String StringBuffer StringBuilder的區別(前端面試必備)

芊吶aoligei發表於2020-12-15

String

String建立物件原始碼

首先要明確String建立的字串是一個物件型別

  1. 斷子絕孫類,來看一下String類的構造方法,為final型別,沒有子類可以繼承它,可以看到這個類是用一個陣列型別去接收建立的字串的,我們知道,陣列內的資料無法改變,則String型別的資料是無法改變的,所以沒有個用String建立的物件都有各自獨立的空間也就是記憶體地址。
public final class String implements...{
	private final char value[];
}

String建立字串的兩個方法和區別

該部分常講到常量池,請不懂常量池的小夥伴先移步到常量池的介紹
1.通過引號直接建立字串

String str="1280809174";

通過該方法建立一個字串,因為1280809174是一個常量,首先會從常量池中判斷是否已經存在1280809174這個物件,如果不存在,則會分配空間建立該物件,若常量池中存在該物件,即有一個常量等於1280809174,則不會分配空間,直接返回原有的該物件的記憶體地址。如下面例子,最後結果返回true

String str1="1280809174";

String str2="1280809174";

if(str1==str2){
	return true;
}

2.通過new String()建立

String str=new String("1280809174");

這種方式它將會建立兩個1280809174物件,為什麼呢?
  首先1280809174 是一個常量字串,因此會先在常量池中建立 1280809174字串物件,然後在堆中再建立一個字串物件,將 1280809174的字元陣列複製到堆中新建立的物件的字元陣列上,因此該方式不僅會在堆中,還會在常量池中建立1280809174 字串物件。 如下程式碼,將返回false

		String str1=new String("123");
		String str2=new String("123");
		System.out.println(str1==str2);


StringBuffer

StringBuffer 是一個執行緒安全可變的字元序列。它繼承於AbstractStringBuilder,實現了CharSequence介面。執行緒安全指能夠是執行緒同步的意思,就是當一個程式對一個執行緒安全的方法或者語句進行訪問的時候,其他的不能再對他進行操作了,必須等到這次訪問結束以後才能對這個執行緒安全的方法進行訪問。能夠運用於多執行緒

StringBuilder

執行緒不安全,但相比較於StringBuffer效率更高。

總結

(1)如果要操作少量的資料用 String;

(2)多執行緒操作字串緩衝區下操作大量資料 StringBuffer;

(3)單執行緒操作字串緩衝區下操作大量資料 StringBuilder。

相關文章