String 的源码大家应该都能看懂,这里就不一一分析咯,重点讲一下 equals()和 hashcode()方法,然后看一下 String 类常用方法的实现,就当一起温习一下咯。
publicfinalclassStringimplementsjava.io.Serializable, Comparable<String>, CharSequence { /** 保存String的字符数组 */privatefinalcharvalue[]; /** 缓存这个String的hash值 */privateinthash; // Default to 0/** use serialVersionUID from JDK 1.0.2 for interoperability */privatestaticfinallongserialVersionUID = -6849794470754667710L; /** * 1、Object的 hashCode()返回该对象的内存地址编号,而equals()比较的是内存地址是否相等; * 2、需要注意的是当equals()方法被重写时,hashCode()也要被重写; * 3、按照一般hashCode()方法的实现来说,equals()相等的两个对象,hashcode()必须保持相等; * equals()不相等的两个对象,hashcode()未必不相等 * 4、一个类如果要作为 HashMap 的 key,必须重写equals()和hashCode()方法 */publicbooleanequals(ObjectanObject) { if (this == anObject) { returntrue; } if (anObjectinstanceofString) { StringanotherString = (String)anObject; intn = value.length; if (n == anotherString.value.length) { charv1[] = value; charv2[] = anotherString.value; inti = 0; while (n-- != 0) { if (v1[i] != v2[i]) returnfalse; i++; } returntrue; } } returnfalse; } publicinthashCode() { inth = hash; if (h == 0 && value.length > 0) { charval[] = value; for (inti = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } returnh; } /** * 指定下标的char */publiccharcharAt(intindex) { if ((index < 0) || (index >= value.length)) { thrownewStringIndexOutOfBoundsException(index); } returnvalue[index]; } /** * 是否以 prefix 为前缀 */publicbooleanstartsWith(Stringprefix) { returnstartsWith(prefix, 0); } /** * 是否以 suffix 为后缀 */publicbooleanendsWith(Stringsuffix) { returnstartsWith(suffix, value.length - suffix.value.length); } /** * 该String对象 是否满足 regex正则表达式 */publicbooleanmatches(Stringregex) { returnPattern.matches(regex, this); } /** * 字符替换 */publicStringreplace(charoldChar, charnewChar) { if (oldChar != newChar) { intlen = value.length; inti = -1; char[] val = value; /* avoid getfield opcode */while (++i < len) { if (val[i] == oldChar) { break; } } if (i < len) { charbuf[] = newchar[len]; for (intj = 0; j < i; j++) { buf[j] = val[j]; } while (i < len) { charc = val[i]; buf[i] = (c == oldChar) ? newChar : c; i++; } returnnewString(buf, true); } } returnthis; } /** * 子串替换 */publicStringreplaceAll(Stringregex, Stringreplacement) { returnPattern.compile(regex).matcher(this).replaceAll(replacement); } /** * 子串替换,只替换第一个 */publicStringreplaceFirst(Stringregex, Stringreplacement) { returnPattern.compile(regex).matcher(this).replaceFirst(replacement); } /** * 按 regex 切割成多个子串 */publicString[] split(Stringregex) { returnsplit(regex, 0); } /** * 剪切指定范围的字符串 */publicStringsubstring(intbeginIndex) { if (beginIndex < 0) { thrownewStringIndexOutOfBoundsException(beginIndex); } intsubLen = value.length - beginIndex; if (subLen < 0) { thrownewStringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : newString(value, beginIndex, subLen); } publicStringsubstring(intbeginIndex, intendIndex) { if (beginIndex < 0) { thrownewStringIndexOutOfBoundsException(beginIndex); } if (endIndex > value.length) { thrownewStringIndexOutOfBoundsException(endIndex); } intsubLen = endIndex - beginIndex; if (subLen < 0) { thrownewStringIndexOutOfBoundsException(subLen); } return ((beginIndex == 0) && (endIndex == value.length)) ? this : newString(value, beginIndex, subLen); } /** * 获取该String 对应的 char[] */publicchar[] toCharArray() { // Cannot use Arrays.copyOf because of class initialization order issuescharresult[] = newchar[value.length]; System.arraycopy(value, 0, result, 0, value.length); returnresult; } /** * 大小写转换 */publicStringtoLowerCase() { returntoLowerCase(Locale.getDefault()); } publicStringtoUpperCase() { returntoUpperCase(Locale.getDefault()); } /** * str在本String对象中第一次出现的下标 */publicintindexOf(Stringstr) { returnindexOf(str, 0); } /** * str在本String对象中最后一次出现的下标 */publicintlastIndexOf(Stringstr) { returnlastIndexOf(str, value.length); } }