String的底层结构(使用频率较高的)

1 String被final修饰 说明String 无法被其他类继承

2 实现Serializable接口 说明String可以序列化

3 实现Comparable接口 String可以进行对应的排序

4 实现CharSequence接口 CharSequence就是字符序列说明String是通过字符数组实现的

      CharSequence它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口

 

属性

/**  该值用于字符存储。 */ 更说明 String本质是char类型的数组

private final char value[];



/**  缓存字符串的哈希代码 */

private int hash; // 默认为0



/** use serialVersionUID from JDK 1.0.2 for interoperability */

private static final long serialVersionUID = -6849794470754667710L;



/**

* Class String is special cased within the Serialization Stream Protocol.

*

* A String instance is written into an ObjectOutputStream according to

* 

* Object Serialization Specification, Section 6.2, "Stream Elements"

*/

private static final ObjectStreamField[] serialPersistentFields =

    new ObjectStreamField[0];

 

方法

public int length() {

    return value.length; // 数组value[]的属性

}

public boolean isEmpty() {

    return value.length == 0; // 根据数组value[]的长度

}


public char charAt(int index) {

    if ((index < 0) || (index >= value.length)) {

        throw new StringIndexOutOfBoundsException(index);

    }

    return value[index]; //返回第index个字符,下标从0开始

}



public int codePointAt(int index) { //返回指定下标的代码点  也就是汉字或英文字符等在unicode编码中代表的数字 为十进制  可通过工具转十六进制在转回字符

    if ((index < 0) || (index >= value.length)) {

        throw new StringIndexOutOfBoundsException(index);

    }

    return Character.codePointAtImpl(value, index, value.length);

}



public boolean equals(Object anObject) { 
    
     // 二个对象不是存放在堆空间 试用如 String  a= "a"; 这样的默认放入扎空间;
    //开始先和自己进行对比
    if (this == anObject) { 

        return true;

    }
    
    //判断是否是String类的数据,其他自定义类型的如果不重写equals() 方法
    //那么就是引用Object的equals方法也就是通过 == 对比
    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 compareTo(String anotherString) { // 排序

    int len1 = value.length;

    int len2 = anotherString.value.length; //anotherString的字符长度

    int lim = Math.min(len1, len2);// 返回二个int较小的值

    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; //从0开始一但其中一个的unicode编码代码点不同,返回它们二个代码点的差

        }

        k++;

    }

    return len1 - len2;

}



测试此字符串是否以指定的后缀结尾。

public boolean endsWith(String suffix) {

    return startsWith(suffix, value.length - suffix.value.length); //如此相减 有力使其只对比最后几个

}

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;

}



public int hashCode() {

    int h = hash;

    if (h == 0 && value.length > 0) {

        char val[] = value;  // value并不是*.hashCode中的* 而是java.lang.invoke包中接口属性 如java.lang.invoke.MethodHandleImpl.MAX_ARITY

        for (int i = 0; i < value.length; i++) {

            h = 31 * h + val[i]; //每个字符的代码点相互乘得到的int数字 引用的不同的类型做前缀

        }

        hash = h;

    }

    return h;

}

如有不正确之处欢迎指点

你可能感兴趣的:(java)