String的底层结构(使用频率较高的)(java.lang.invoke.MethodHandleImpl.MAX_ARITY)

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
* <a href="{@docRoot}/../platform/serialization/spec/output.html">
* Object Serialization Specification, Section 6.2, "Stream Elements"</a>
*/
 
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;
 
}
如有不正确之处欢迎指点

原文:https://blog.csdn.net/nullandmy/article/details/83271482 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值