String、StringBuffer、StringBuilder的區別

uni7corn發表於2014-10-29
   今天,和同學說後2者的時候,把特性說反了。自己也覺得好像有點不對。那麼我就直接翻了官方原始碼!發現,我確實是講錯了!為了讓自己更加清除!我就寫一篇學習日誌把!我也是小白,說得不好的地方請大牛指正!

1.String:字串類
a.字串的定義:4種方式
    
    String name1 = "hello";
    String name2 = new String("hello");
    char [] chary ={'h','e','l','l','o'};
    String name3 = new String(chary);
    字串本質上就是一個的字元陣列,而每一個字元
    對應一個ASCII,而ASCII的取值範圍-128到127
    byte [] buf = {72,69,76,76,79};
    String name4 = new String(buf);
  b.字串如何轉換成 char陣列 byte 陣列。  
    char [] ch = name1.toCharArray();
<span style="white-space:pre">	</span>byte [] buf1 = name1.getBytes();
  c.字串的比較。
    ==     比較的是地址是否相同。
    equals 比較的是兩個字串的內容是否相同。 
    
    String name1 = "nihao";
    String name2 = new String(name1);
    字串本質上就是一堆的ASCII碼組成的。而
    ASCII是常量,而常量開闢記憶體在棧區的常量池
    中,而字串最初都是在常量池中構造出來的。
    常量池中的內容有一個特點,一旦有一個nihao
    就不會產生另一個nihao,唯一性。
    +的本質,並不是將一個字串拼接到另一個字串
    的後面,而是在堆區重新開闢記憶體。
    
    字串最初構造在常量池,因此,字串具有常量
    的特點:不變性。
    而+號會要在堆區開闢記憶體,因此如果頻繁對字串
    做+的操作,是要消耗記憶體的,減低效能的。
    
    所以,如果要做字串頻繁的+的操作,請用下兩者

2.StringBuffer:
     jdk1.1的時候出現
     帶有緩衝的字串類。初始化容量是16字元,
  如果有其他字元拼接,是追加到字串的後面。
  這個字串的容量是以一倍的形式擴充。
  append();
   原始碼我不貼出來了,裡面大多的方法都是使用了同步程式碼塊關鍵字synchronized,因此,它的這些追加方法,是執行緒安全的。那麼就會失去效能!後來為了效率,出現了
   StringBuilder

3.StringBuilder:
  我們先來看看原始碼:該類,是jdk1.5的時候才有的。並且和StringBuffer功能上差不多,而且該類其中的所有方法都沒有同步程式碼塊,所以是非執行緒安全的,那麼這樣的話,和StringBuffer相比追加字串的時候就會更加效率!
<pre name="code" class="java">/**
 * A modifiable {@link CharSequence sequence of characters} for use in creating
 * strings. This class is intended as a direct replacement of
 * {@link StringBuffer} for non-concurrent use; unlike {@code StringBuffer} this
 * class is not synchronized.
 *
 * <p>For particularly complex string-building needs, consider {@link java.util.Formatter}.
 *
 * <p>The majority of the modification methods on this class return {@code
 * this} so that method calls can be chained together. For example:
 * {@code new StringBuilder("a").append("b").append("c").toString()}.
 *
 * @see CharSequence
 * @see Appendable
 * @see StringBuffer
 * @see String
 * @see String#format
 * @since 1.5
 */
public final class StringBuilder extends AbstractStringBuilder implements
        Appendable, CharSequence, Serializable {

    private static final long serialVersionUID = 4383685877147921099L;

    /**
     * Constructs an instance with an initial capacity of {@code 16}.   //初始容量16,和StringBuffer一樣
     *


   具體用到什麼地方:當我們在對流的操作的時候,我們就可以使用StringBuffer或者StringBuilder,代替String類。這樣會提高效率哦。
到這裡,我想你肯定熟悉這3個類的了。那就自己試試把!


相關文章