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;
}
如有異議歡迎指點