首頁  >  文章  >  Java  >  string、stringbuffer和stringbuilder的差別是什麼?

string、stringbuffer和stringbuilder的差別是什麼?

青灯夜游
青灯夜游原創
2020-11-20 09:54:2713878瀏覽

區別:String類別是不可變類,當一個String物件被創建,則包含在物件中的字元序列是不可改變的,直到物件被銷毀;StringBuffer物件代表可變字串對象,且線程安全;StringBuilder類別代表可變字串對象,且非線程安全。

string、stringbuffer和stringbuilder的差別是什麼?

String、StringBuffer與StringBuilder的差異:

String

  String類別是不可變類,也就是一旦一個String物件被建立以後,包含在這個物件中的字元序列是不可改變的,直到這個物件被銷毀。

  這個是String類別的解釋,之前小鹹兒看到這個情況,不能理解上述的解釋,如下

String a = "123";
a = "456";
// 打印出来的a为456
System.out.println(a)

  看到這裡,小鹹兒不明白了,這不是明明已經對他進行修改了嗎?為什麼還說他是不可變類呢?

  經過小鹹兒和小夥伴們的學習,明白String類別不可變在哪裡體現出來的,接下來就看一張上述a物件的記憶體儲存空間圖
string、stringbuffer和stringbuilder的差別是什麼?

  可以看出來,再次給a賦值時,並不是對原來堆中實例對象進行重新賦值,而是生成一個新的實例對象,並且指向“456”這個字符串, a則指向最新產生的實例對象,先前的實例對象仍然存在,如果沒有再次被引用,則會被垃圾回收。

StringBuffer

  StringBuffer物件則代表一個字元序列可變的字串,當一個StringBuffer被建立以後,透過StringBuffer提供的append ()、insert()、reverse()、setCharAt()、setLength()等方法可以改變這個字串物件的字元序列。一旦透過StringBuffer產生了最終想要的字串,就可以呼叫它的toString()方法將其轉換為一個String物件。

StringBuffer b = new StringBuffer("123");
b.append("456");
// b打印结果为:123456
System.out.println(b);

  在看一下b物件的記憶體空間圖:
string、stringbuffer和stringbuilder的差別是什麼?

  所以說StringBuffer物件是一個字元序列可變的字串,它沒有重新產生一個對象,而且在原來的對像中可以連接新的字串。

StringBuilder

  StringBuilder類別也代表可變字串物件。實際上,StringBuilder和StringBuffer基本上相似,兩個類別的建構器和方法也基本上相同。不同的是:StringBuffer是執行緒安全的,而StringBuilder則沒有實作執行緒安全功能,所以效能略高。

StringBuffer是如何實作執行緒安全的呢?

StringBuffer類別中實作的方法:

string、stringbuffer和stringbuilder的差別是什麼?

#StringBuilder類別中實作的方法:

string、stringbuffer和stringbuilder的差別是什麼?

  由此可見,StringBuffer類別中的方法都加入了synchronized關鍵字,也就是為這個方法增加了一個鎖,用來確保執行緒安全。

Java9的改進

  Java9改進了字串(包括String、StringBuffer、StringBuilder)的實作。在Java9以前字串採用char[]數組來保存字符,因此字串的每個字符佔2字節;而Java9的字串採用byte[]數組再加一個encoding-flag字段來保存字符,因此字符串的每個字元只佔1位元組。所以Java9的字串比較節省空間,字串的函式方法也沒有受到影響。

更多程式相關知識,請造訪:程式設計入門! !

以上是string、stringbuffer和stringbuilder的差別是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn