String 的源码大家应该都能看懂,这里就不一一分析咯,重点讲一下 equals()和 hashcode()方法,然后看一下 String 类常用方法的实现,就当一起温习一下咯。 ```java public final class String implements java.io.Serializable, Comparable, CharSequence { /** 保存String的字节数组 */ private final char value[]; /** 缓存这个String的hash值 */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L; /** * 1、Object的 hashCode()返回该对象的内存地址编号,而equals()比较的是内存地址是否相等; * 2、需要注意的是当equals()方法被重写时,hashCode()也要被重写; * 3、按照一般hashCode()方法的实现来说,equals()相等的两个对象,hashcode()必须保持相等; * equals()不相等的两个对象,hashcode()未必不相等 * 4、一个类如果要作为 HashMap 的 key,必须重写equals()和hashCode()方法 */ 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; } 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; } /** * 指定下标的char */ public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } return value[index]; } /** * 是否以 prefix 为前缀 */ public boolean startsWith(String prefix) { return startsWith(prefix, 0); } /** * 是否以 suffix 为后缀 */ public boolean endsWith(String suffix) { return startsWith(suffix, value.length - suffix.value.length); } /** * 该String对象 是否满足 regex正则表达式 */ public boolean matches(String regex) { return Pattern.matches(regex, this); } /** * 字符替换 */ public String replace(char oldChar, char newChar) { if (oldChar != newChar) { int len = value.length; int i = -1; char[] val = value; /* avoid getfield opcode */ while (++i < len) { if (val[i] == oldChar) { break; } } if (i < len) { char buf[] = new char[len]; for (int j = 0; j < i; j++) { buf[j] = val[j]; } while (i < len) { char c = val[i]; buf[i] = (c == oldChar) ? newChar : c; i++; } return new String(buf, true); } } return this; } /** * 子串替换 */ public String replaceAll(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceAll(replacement); } /** * 子串替换,只替换第一个 */ public String replaceFirst(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceFirst(replacement); } /** * 按 regex 切割成多个子串 */ public String[] split(String regex) { return split(regex, 0); } /** * 剪切指定范围的字符串 */ public String substring(int beginIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } int subLen = value.length - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : new String(value, beginIndex, subLen); } public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > value.length) { throw new StringIndexOutOfBoundsException(endIndex); } int subLen = endIndex - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen); } /** * 获取该String 对应的 char[] */ public char[] toCharArray() { // Cannot use Arrays.copyOf because of class initialization order issues char result[] = new char[value.length]; System.arraycopy(value, 0, result, 0, value.length); return result; } /** * 大小写转换 */ public String toLowerCase() { return toLowerCase(Locale.getDefault()); } public String toUpperCase() { return toUpperCase(Locale.getDefault()); } /** * str在本String对象中第一次出现的下标 */ public int indexOf(String str) { return indexOf(str, 0); } /** * str在本String对象中最后一次出现的下标 */ public int lastIndexOf(String str) { return lastIndexOf(str, value.length); } } ```