String其實就是一個char集合
String只是大致看了下,基本都是對char數組的操作,包括判斷是否為空白,或者取指定下標資料等等。。
String類是final修飾的,所以不可被繼承,實現了java.io.Serializable, Comparable<String>, CharSequence等介面,說明String是可以序列化和還原序列化的,並且支援自訂的字串比較。
主要記錄下equals和hashCode兩個方法,這兩個方法都是重寫的Object類的。
Object類的equals方法其實使用的還是"=="
public boolean equals(Object obj) {
return (this == obj);
}
而hashCode不是用java寫的,就不多說了
下面是String重寫的
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;
}
首先判斷對象地址是否相同,地址相同就直接返回true,地址不相同再判斷字串長度是否相同,最後再對字串的每個字元一一進行對比。
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;
}
雜湊的地址演算法主要就是h = 31 * h + val[i],每次是將上次一算出的hash值乘以31 然後再加上當前字元編碼值,由於這裡使用的是int肯定會有一個上限,當字串超過上限,HashCode的正確性就無法保證了,所以這點可以推斷出HashCode存在不相同字元擁有相同HashCode。
字串相同,雜湊一定相同,雜湊相同,字串不一定相同。