public boolean contentEquals(CharSequence cs) {
if (value.length != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
char v1[] = value;
char v2[] = ((AbstractStringBuilder) cs).getValue();
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
// Argument is a String
if (cs.equals(this))
return true;
// Argument is a generic CharSequence
char v1[] = value;
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != cs.charAt(i))
return false;
i++;
}
return true;
}
charAt(i)和value[i]的区别:下标访问非常快,而charAt()也是根据下标,额外多了个if判断,效率区别在于charAt()会进出栈+if,单个String效率差别并不大,我试了下,1w长度的字符串,这两种方法仅差3 milliseconds左右, 但要知道jvm里的大部分对象都是String,积沙成塔,这里额外的一点点高效也是非常乐观的。
ArrayList 实现RandomAccess,而LinkedList没有,在get()和subList()的时候这2个方法是不同的。
Integer.valueOf() 如果值是在-128~127,直接取的缓存。