String 源码解析
- class -> final ,继承自java.io.Serialize,Comparable,CharSequence,Character(字符串的操作大部分是此类的方法,还有Arrays,System.copyOf等)
- properties -> final char[] value, final int hash
method - equals
/**
* 判定标准:
* 1. 是否是源对象
* 2. 是String.class && (char[] v1) == (char[] v2) 长度相等且每个char都相等
**/
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;
}
method - compareTo
/**
* 判定标准
* 1. 大于=1 等于=0 小于=-1
* 2. Object1,Object2 to char[] vl1,char[]2 , vl1[inx] !=vl2[inx];
**/
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;
}
String - 彩蛋
/**
* 使用场景:
* 1.块级作用域
* 2.嵌套循环, 可直接跳出至指定的循环level
**/
scan: {
for (firstUpper = 0 ; firstUpper < len; ) {
char c = value[firstUpper];
if ((c >= Character.MIN_HIGH_SURROGATE)
&& (c <= Character.MAX_HIGH_SURROGATE)) {
int supplChar = codePointAt(firstUpper);
if (supplChar != Character.toLowerCase(supplChar)) {
break scan;
}
firstUpper += Character.charCount(supplChar);
} else {
if (c != Character.toLowerCase(c)) {
break scan;
}
firstUpper++;
}
}
return this;
}