@ZeroGeek
2015-08-27T06:41:47.000000Z
字数 2444
阅读 852
Java 基础知识
源码版本:JDK_1.7.0_55
public final class String //注意finalimplements java.io.Serializable, Comparable<String>, CharSequence {//保证只能初始化一次,用字符数组来存private final char value[];// 存储hashCode,默认为0private int hash;//判断是否相等public boolean equals(Object anObject) {if (this == anObject) { //同一对象return true;}if (anObject instanceof String) { //若同为String类型String anotherString = (String) anObject;int n = value.length; //本字符串长度if (n == anotherString.value.length) { //长度相同,比较每个字符(ASCII码)是否相同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;}//比较String的大小,返回的是 "str1 - str2"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) { //从0比较到lim-1char c1 = v1[k];char c2 = v2[k];if (c1 != c2) {return c1 - c2; //不相等返回}k++;}return len1 - len2; //若v[lim-1]以前都相等,则判断长度,长的值大}//获得hashCode,赋值给hashpublic int hashCode() {int h = hash;if (h == 0 && value.length > 0) {//若之前没有计算过hashCode,且存在String,则生成一个hashCodechar val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i]; //计算方法,为了唯一性.}hash = h;}return h;}/*看了下"zero"生成hashCode过程:0:1221:38832:1204873:3735208hashCode:3735208*///得到某一字符public char charAt(int index) {if ((index < 0) || (index >= value.length)) { //是否越界throw new StringIndexOutOfBoundsException(index);}return value[index]; //直接下标返回}//替换方法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) { //遍历判断第一个oldChar的位置break;}}if (i < len) { //存在oldCharchar buf[] = new char[len]; //重新生成等长字符数组for (int j = 0; j < i; j++) {buf[j] = val[j]; //0至i-1的值保持不变}while (i < len) {char c = val[i];buf[i] = (c == oldChar) ? newChar : c;//找到存在oldChar位置的地方,在新字符数组处赋值为newChar;i++;}return new String(buf, true); //实际上是重新生成了一个String}}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;//substring(st, len),里面是用了Arrays里面的copyOfRange方法/*public static char[] copyOfRange(char[] original, int from, int to) {int newLength = to - from;if (newLength < 0)throw new IllegalArgumentException(from + " > " + to);char[] copy = new char[newLength];//native方法System.arraycopy(original, from, copy, 0,Math.min(original.length - from, newLength));return copy;}*/}public native String intern();...}