1. 程式人生 > >String的底層結構(使用頻率較高的)

String的底層結構(使用頻率較高的)

1 String被final修飾 說明String 無法被其他類繼承

2 實現Serializable介面 說明String可以序列化

3 實現Comparable介面 String可以進行對應的排序

4 實現CharSequence介面 CharSequence就是字元序列說明String是通過字元陣列實現的

      CharSequence它只包括length(), charAt(int index), subSequence(int start, int end)這幾個API介面

屬性

/**  該值用於字元儲存。 */ 更說明 String本質是char型別的陣列

private final char value[];

/**  快取字串的雜湊程式碼 */

private int hash; // 預設為0

/** use serialVersionUID from JDK 1.0.2 for interoperability */

private static final long serialVersionUID = -6849794470754667710L;

/**

* Class String is special cased within the Serialization Stream Protocol.

*

* A String instance is written into an ObjectOutputStream according to

* <a href="{@docRoot}/../platform/serialization/spec/output.html">

* Object Serialization Specification, Section 6.2, "Stream Elements"</a>

*/

private static final ObjectStreamField[] serialPersistentFields =

    new ObjectStreamField[0];

方法

public int length() {

    return value.length; // 陣列value[]的屬性

}

public boolean isEmpty() {

    return value.length == 0; // 根據陣列value[]的長度

}

public char charAt(int index) {

    if ((index < 0) || (index >= value.length)) {

        throw new StringIndexOutOfBoundsException(index);

    }

    return value[index]; //返回第index個字元,下標從0開始

}

public int codePointAt(int index) { //返回指定下標的程式碼點  也就是漢字或英文字元等在unicode編碼中代表的數字 為十進位制  可通過工具轉十六進位制在轉回字元

    if ((index < 0) || (index >= value.length)) {

        throw new StringIndexOutOfBoundsException(index);

    }

    return Character.codePointAtImpl(value, index, value.length);

}

public boolean equals(Object anObject) { // 不瞭解定義為Object的意義

    if (this == anObject) {  // 二個物件不是存放在堆空間 試用如 String  a= "a"; 這樣的預設放入扎空間;

        return true;

    }

    if (anObject instanceof String) {  // 只適用於String類物件 ,其他自定義的要重寫equals() 方法

        String anotherString = (String)anObject;

        int n = value.length;

        if (n == anotherString.value.length) {

            char v1[] = value;

            char v2[] = anotherString.value;

            int i = 0;

            while (n-- != 0) {

                if (v1[i] != v2[i])

                    return false;

                i++;

            }

            return true;

        }

    }

    return false;

}

按字典順序比較兩個字串。

public int compareTo(String anotherString) { // 排序

    int len1 = value.length;

    int len2 = anotherString.value.length; //anotherString的字元長度

    int lim = Math.min(len1, len2);// 返回二個int較小的值

    char v1[] = value;

    char v2[] = anotherString.value;

    int k = 0;

    while (k < lim) {

        char c1 = v1[k];

        char c2 = v2[k];

        if (c1 != c2) { //

            return c1 - c2; //從0開始一但其中一個的unicode編碼程式碼點不同,返回它們二個程式碼點的差

        }

        k++;

    }

    return len1 - len2;

}

測試此字串是否以指定的字尾結尾。

public boolean endsWith(String suffix) {

    return startsWith(suffix, value.length - suffix.value.length); //如此相減 有力使其只對比最後幾個

}

public boolean startsWith(String prefix, int toffset) {

    char ta[] = value;

    int to = toffset; // 從哪裡開始對比

    char pa[] = prefix.value;

    int po = 0;

    int pc = prefix.value.length;

    // Note: toffset might be near -1>>>1.

    if ((toffset < 0) || (toffset > value.length - pc)) {

        return false;

    }

    while (--pc >= 0) {

        if (ta[to++] != pa[po++]) {

            return false;

        }

    }

    return true;

}

public int hashCode() {

    int h = hash;

    if (h == 0 && value.length > 0) {

        char val[] = value;  // value並不是*.hashCode中的* 而是java.lang.invoke包中介面屬性 如java.lang.invoke.MethodHandleImpl.MAX_ARITY

        for (int i = 0; i < value.length; i++) {

            h = 31 * h + val[i]; //每個字元的程式碼點相互乘得到的int數字 引用的不同的型別做字首

        }

        hash = h;

    }

    return h;

}

如有異議歡迎指點