理解String與StringBuffer、StringBuilder的區別與用法
在談String之前,先來分享一段從已找不到的某位不知名博主分享的 關於字串在最近版本的改動:
在Java9之前,字串是使用char[]陣列來儲存字元的,因此每個字元佔用兩個位元組。在Java9之後,字串使用byte[]陣列再加一個encoding -falg欄位來儲存字元,因此字串每個字元只佔用一個位元組。所以Java9之後的的字串更節省空間,且字串的方法也沒有受到影響。
一、String
回到正題,細心地朋友看過String類的原始碼就會發現,他是被final修飾的:
也就是說,String類是不可變類(當然也不可以被繼承),一旦一個String物件被建立之後,其內容就是不可改變的,直至整個物件被銷燬為止。
public static void main(String[] args) {
String a = "Hello";
a = "World";
System.out.println(a); //World
}
上面看似好像是先建立了個物件a,內容為"Hello",再對此物件進行賦值為“World”。但實際卻不是這樣的,真正的是Java先在記憶體中建立了個內容為“Hello”的物件,並用字母a指向了這個物件,之後再在記憶體中建立了個“World”字串物件,並將a改指向此物件。
這兩者的差異就是並不是對原來物件進行重新賦值,而是生成了一個新的String物件,會造成額外的記憶體消耗。之前的例項物件仍然存在,直到程式結束被垃圾回收。
二、StringBuffer
StringBuffer物件則代表一個字元序列可變的字元序列。當一個StringBuffer被建立後,通過StringBuffer提供的append()、insert()、reverse()、setLength等方法可以改變這個字串物件的字元序列,生成最終想要的字串之後,就可以呼叫它的toString()方法將其轉換為一個String物件。
所以說StringBuffer物件時個字元序列可變的字串,它沒有重新生成一個物件,而是在原來的物件中可以連線新的字串。
三、StringBuilder
StringBuilder和StringBuffer基本相似,連個類的構造器和方法也基本相同,不同的是:StringBuffer是執行緒安全的,而StringBuilder沒有實現執行緒安全功能,所以效能略高。
總結:
在無需對字串進行操作時直接使用String類即可;需要對字串進行一系列如拼接,反轉等操作時,字串物件沒有使用在多執行緒內就用StringBuilder,若需要使用多執行緒就使用StringBuffer。