1. 程式人生 > >StringBuffer與StringBuilder異同對比分析

StringBuffer與StringBuilder異同對比分析

ava 但是 原因 碎片 內存碎片 字符 使用字符串 指針 builder

Java的字符類String、StringBuffer與StringBuilder異同對比分析
  
  Java String是一個“不可變常量字符串”對象,final屬性定義。之所以這麽說,是從String內部在盛放字符串時候的容器char數組而言。比如當用戶在初始化階段定義了一個String對象String s=”hello,world!”,而此時再次對s進行操作改變s的值時候,如再次給s賦值使得s=”zhangphil”,那麽Java的JVM其實是再次創建了一個新的String對象,然後移動指針s指向了新的String對象(對象內部的字符串是“zhangphil”)。由此可見,假如在代碼中需要頻繁的修改String對象中的字符內容,那麽應該盡量避免使用String,原因在於每一次修改String內容後,其實就是JVM在內存堆上創建了一個新的String對象,由此導致的問題有三:
  
  (一)如果代碼中的String對象頻繁的修改,表面仍然是在一個String對象中修改賦值,但其實底層的JavaJVM在內存的堆上創建了更多新的String對象,同時與之相伴隨的是更多死去的String對象,此過程簡單總結就是Java JVM在頻繁的創建對象,也產生死去的對象,即,生成一個新的String對象,死去一個String對象。這樣將產生大量JVM內存碎片,極大概率提高Java了系統觸發Java GC的時機,由此降低了系統性能 。
  
  (二)String對象的產生、賦值修改操作過程是多線程不安全操作,原因如前所述,每一次對String對象的賦值、操作,導致Java JVM在底層創建了新的String對象,在操作系統的CPU時機片上,線程不保證安全。如果多線程在操作此String對象,那麽就極有可能在操作系統調度切換CPU時間片時,操作的目標對象不一致,有的指向新的String s對象,有的線程卻仍指向舊的String s對象。
  
  (三)每一次修改賦值String s對象,是創建了新的String對象,然後把新的對象引用賦給s。這個操作是在堆上創建 ,若頻繁操作,勢必造成較大系統開銷。
  
  小結:如果是在代碼啟動後,String對象不再修改重新賦值,那麽可以考慮使用www.feilin158.com String,比如在代碼中定義一些public static final String常量。如果需要在代碼中頻繁修改和賦值操作字符串對象具體內容,建議使用StringBuffer。
  
  不同於String字符串常量,StringBuffer是字符串變量。StringBuffer不會產生www.142714.com String那樣的問題:每一次修改就重新創建一個新的String對象。在某種程度上講,StringBuffer內部維持一個可變長度的char數組盛放用戶字符數據,因此StringBuffer是線程安全的。由於StringBuffer是在一個字符char數組進行原子賦值、操作,不是像String那樣以“乾坤大挪移”的方式改變引用進行字符串賦值、操作,在理論上講,字符的操作層面,StringBuffer的性能優於String。
  
  StringBuilder是在後續新版Java中引入的字符類,StringBuilder和StringBuffer類似,均是字符串變量,但是StringBuilder多線程不安全,而單線程安全,StringBuilder在單線程中性能優於StringBuffer www.huarencai5200.com,所,如果僅僅是在單線程中使用字符串變量,優先可考慮使用StringBuilder。
  
  頂
  
  1
  
  踩
  
  1

StringBuffer與StringBuilder異同對比分析