1. 程式人生 > 實用技巧 >Java原始碼賞析(二)初認 String 類

Java原始碼賞析(二)初認 String 類

由於String類比較複雜,現在採用多篇幅來講述

這一期主要從String使用的關鍵字,實現的介面,屬性以及覆蓋的方法入手。

/**
 * 精簡的String結構,便於我們初步的理解
 * 使用了final關鍵字,說明此類是最終類,無法繼承
 * 實現了序列化介面,排序介面,CharSequence介面
 */
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    private final char value[];

    private
int hash; // Default to 0 private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; /** 實現Comparable<String> */ public int compareTo(String anotherString) {
int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); 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; } k++; } return len1 - len2; } /** 覆蓋hashCode() */ public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; } /** 覆蓋父類equal() */ public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { 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; } /** 覆蓋父類toString() */ public String toString() { return this; } /** * 實現CharSequence介面 * 共有length(), charAt(int index), subSequence(int beginIndex, int endIndex) 等 * 在實現subSequence()方法時使用了String中substring()方法 */ /** 獲取字串長度 */ public int length() { return value.length; } /** 獲取index位置的字元 */ public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } return value[index]; } /** 獲取子字元序列 */ public CharSequence subSequence(int beginIndex, int endIndex) { return this.substring(beginIndex, endIndex); } /** 獲取子串 */ public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > value.length) { throw new StringIndexOutOfBoundsException(endIndex); } int subLen = endIndex - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen); } }

未完待續