String源码解析-jdk1.8

167 阅读1分钟

String 源码解析

  • class -> final ,继承自java.io.Serialize,Comparable,CharSequence,Character(字符串的操作大部分是此类的方法,还有Arrays,System.copyOf等)
  • properties -> final char[] value, final int hash

method - equals

/**
  * 判定标准:
  * 1.  是否是源对象
  * 2.  是String.class && (char[] v1) == (char[] v2) 长度相等且每个char都相等
  **/
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;
    }

method - compareTo

/**
  * 判定标准
  * 1.  大于=1 等于=0 小于=-1
  * 2.  Object1,Object2 to char[] vl1,char[]2 , vl1[inx] !=vl2[inx];
  **/
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;
    }

String - 彩蛋

/**
  * 使用场景:
  * 1.块级作用域
  * 2.嵌套循环, 可直接跳出至指定的循环level
  **/
scan: {
            for (firstUpper = 0 ; firstUpper < len; ) {
                char c = value[firstUpper];
                if ((c >= Character.MIN_HIGH_SURROGATE)
                        && (c <= Character.MAX_HIGH_SURROGATE)) {
                    int supplChar = codePointAt(firstUpper);
                    if (supplChar != Character.toLowerCase(supplChar)) {
                        break scan;
                    }
                    firstUpper += Character.charCount(supplChar);
                } else {
                    if (c != Character.toLowerCase(c)) {
                        break scan;
                    }
                    firstUpper++;
                }
            }
            return this;
        }