Describe: 1.String类提供了java中的所有字面量 2.String对象是常量,值不能被修改,要想修改可以通过StringBuffer来操作 3.String类不可变,所以它们是共享的 Contents: String类提供了 检查字符串序列,字符串比较,查找字符串,截取字符串,大小写转换,编码问题等方法 另外,java提供了,'+'操作字符串,所有对象转换成String类型(Object类提供了ToString方法) 字符串联结是通过StringBuffer和StringBuilder的append方法来实现的,另外是关于码点问题 SourceCode: //实现Serializable表明可序列化,实现Comparable可通过CompareTo方法比较字符串,CharSequence为字符串序列提供了统一的只读访问 public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ //保存字符 private final char value[]; //保存hashcode值(关于hashcode的意义放在Object中讨论) private int hash;// Default to 0 //String类的特殊序列化方式(?????涉及较深先放着) private static final ObjectStreamField[] serialPersistentFields =new ObjectStreamField[0]; //默认的构造函数 public String() { this.value = "".value; } //带参数的构造函数(两个相同的字符串需要有相同的字符数组和相同的hash值) public String(String original) { this.value = original.value; this.hash = original.hash; } //...省略了很多种的构造方法 //字符串长度 public int length() { return value.length; } //判断字符串是否为空,是判断长度为0 public boolean isEmpty() { return value.length == 0; } //查询字符串某个位子的字符 public char charAt(int index) { //先检查序号是否正确 if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } return value[index]; } //先比较地址,在将该Object转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; } //忽略大小写的比较 public boolean equalsIgnoreCase(String anotherString) { return (this == anotherString) ? true : (anotherString != null) && (anotherString.value.length == value.length) && regionMatches(true, 0, anotherString, 0, value.length); } /** @Parameter boolean ignoreCase 是否忽略大小写 @Parameter int toffset 在这个字符串中,子区域的起始偏移量 @Parameter String other 另外的字符串 @Parameter int ooffset 字符串参数中子区域的起始偏移量 @Parameter int len 要比较的字符数 eg:"abcdef".regionMatches(true, 0, "ABC", 0, 3) return true */ //判断部分匹配方法 public boolean regionMatches(boolean ignoreCase, int toffset,String other, int ooffset, int len) { char ta[] = value; int to = toffset; char pa[] = other.value; int po = ooffset; // Note: toffset, ooffset, or len might be near -1>>>1. if ((ooffset < 0) || (toffset < 0) || (toffset > (long)value.length - len) || (ooffset > (long)other.value.length - len)) { return false; } while (len-- > 0) { char c1 = ta[to++]; char c2 = pa[po++]; if (c1 == c2) { continue; } if (ignoreCase) { char u1 = Character.toUpperCase(c1); char u2 = Character.toUpperCase(c2); if (u1 == u2) { continue; } if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) { continue; } } return false; } return true; } //重写compareTo方法,将两个字符串转化为字符数组后比较,返回的是第一个不相等的字符的差 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; } //判断字符串是否是从toffset 开始的 包含prefix public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = toffset; char pa[] = prefix.value; int po = 0; int pc = prefix.value.length; // Note: toffset might be near -1>>>1. if ((toffset < 0) || (toffset > value.length - pc)) { return false; } while (--pc >= 0) { if (ta[to++] != pa[po++]) { return false; } } return true; } //hashcode的算法 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; } //截取字符串返回的是一个新的字符串对象 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); } //将原字符串中的某个字符oldChar 全部变成newChar 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 trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
}