1. 程式人生 > 實用技巧 >Redis 記憶體監控和記憶體消耗【轉】

Redis 記憶體監控和記憶體消耗【轉】

String、StringBuffer和StringBuilder的區別:

轉自https://blog.csdn.net/csxypr/article/details/92378336

文章目錄

String

  String類是不可變類,即一旦一個String物件被建立以後,包含在這個物件中的字元序列是不可改變的,直至這個物件被銷燬。

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

String a = "123";
a = "456";
// 打印出來的a為456
System.out.println(a)
  • 1
  • 2
  • 3
  • 4

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

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

  可以看出來,再次給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);
  • 1
  • 2
  • 3
  • 4

  在看一下b物件的記憶體空間圖:

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

StringBuilder

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

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

StringBuffer類中實現的方法:

StringBuilder類中實現的方法:

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

Java9的改進

  Java9改進了字串(包括String、StringBuffer、StringBuilder)的實現。在Java9以前字串採用char[]陣列來儲存字元,因此字串的每個字元佔2位元組;而Java9的字串採用byte[]陣列再加一個encoding-flag欄位來儲存字元,因此字串的每個字元只佔1位元組。所以Java9的字串更加節省空間,字串的功能方法也沒有受到影響。