String源码.md

成员变量

private final char value[];//这个char数组很重要,大多数方法都是操作这个数组
private int hash; // Default to 0  哈希值

构造器


看几个关键的构造器就OK了

//默认构造器,相当于 String s = "";
public String() {
    this.value = "".value;
}
//这是最常用的一个构造器
//主要是初始化上面两个成员变量
 public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
//也算常用吧
public String(char value[]) {
    //把value[] 数组的值拷贝到成员变量里面
    //说道这里,必须看一下copyOf()方法里的arraycopy();
    this.value = Arrays.copyOf(value, value.length);
}
//这是一个本地方法
//作用是 从src的起始位置srcPos  拷贝 长度length 个字符  到目标数组destPost(拷贝的起始位置是destPos)
System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length);

//StringBuilder后面再讲解
 public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

简单的一组

//返回char[]数组的长度
 public int length() {
    return value.length;
}
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];
}
/**
* 把字符串 srcBegin到srcEnd 这几个字符 拷贝到目标数组dst[] 的第dstBegin处
*/
 public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
    if (srcBegin < 0) {
        throw new StringIndexOutOfBoundsException(srcBegin);
    }
    if (srcEnd > value.length) {
        throw new StringIndexOutOfBoundsException(srcEnd);
    }
    if (srcBegin > srcEnd) {
        throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
    }
    System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}

public boolean equals(Object anObject) {
    if (this == anObject) { //如果比较的自身,肯定相等
        return true;
    }
    //先比较两者的长度
    //然后再按顺序比较每个字符是否相等,只要一个不相等就返回false
    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;
}
/**
* 把每个字符转换成int值,然后按照下面的公式叠加
*  s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
*/
public int hashCode() {
    int h = hash; //成员变量起到缓存的作用,因为String是不可变对象,只在第一次会计算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 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.
    //解释一下toffset > value.length - pc  
    //假如 字符串 str="abcdefgh" prefix="efgh" toffset=5 , 很明显了吧
    if ((toffset < 0) || (toffset > value.length - pc)) {
        return false;
    }
    while (--pc >= 0) {
        if (ta[to++] != pa[po++]) {
            return false;
        }
    }
    return true;
}

//理解了上面的,这个就很容易了
public boolean endsWith(String suffix) {
    return startsWith(suffix, value.length - suffix.value.length);
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值