1. 程式人生 > >Java中的String為什麼是不可變的? -- String原始碼分析

Java中的String為什麼是不可變的? -- String原始碼分析

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0


由以上的程式碼可以看出, 在Java中String類其實就是對字元陣列的封裝。JDK6中, value是String封裝的陣列,offset是String在這個value陣列中的起始位置,count是String所佔的字元的個數。在JDK7中,只有一個value變數,也就是value中的所有字元都是屬於String這個物件的。這個改變不影響本文的討論。 除此之外還有一個hash成員變數,是該String物件的雜湊值的快取,這個成員變數也和本文的討論無關。在Java中,陣列也是物件(可以參考我之前的文章
java中陣列的特性
)。 所以value也只是一個引用,它指向一個真正的陣列物件。其實執行了String s = “ABCabc”; 這句程式碼之後,真正的記憶體佈局應該是這樣的: