Java源码___String类(六)

java.lang.String分析摘要:
<1>startsWith 重载方法
<2>endsWith(String suffix)
<3>hashCode()
<4>indexOf重载方法

1.startsWith重载方法
 该方法的作用是:判断字符串是否是否以实参字符串开头,是返回true,否则返回false。

//判断本字符串是否以实参prefix开头
//prefix:用于比较的字符串
 public boolean startWith(String prefix){
     return startWith(prefix, 0);
 }

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;
    if((toffset<0) || (toffset>value.length - pc)){
        return false;
    }
    while(--pc >= 0){
        if(ta[to++] != pa[po++]){
            return false;
        }
    }
    return true;
}

这个方法是的属性有:public公有的。
参数:prefix要被比较的开始字符串
参数:toffset该字符串开头比较的位置,取值为下标

返回值:boolean类型
返回值说明:根据规则的情况下,符合要求(以prefix结尾)返回true,否则返回false。

2. endsWith(String suffix)方法
 该方法与startWith相对应,判断的是本字符串是否以实参字符串结尾。

public boolean endsWith(String suffix){
    reutn startWith(suffix, value.length-suffix.value.length);
}

这个方法是的属性有:public公有。
参数:suffix 要比较结尾的字符串
返回值:boolean类型
返回值说明:如果本字符串是以suffix结尾,则返回true。否则返回false。

该源码的思路是:
<1>通过value.length - suffix.value.length来确定suffix在本字符串的下标。
<2>然后通过startsWith(suffix, value.length-suffix.value.length)来简介达到比较结尾的目的。

 

3.hashCode()方法
 该方法重写了Object类的hashCode方法,返回一个hash值。

public int hashCode(){
    int h = hash;
    if(h==0 && value.length>0){
        char[] val = value;
        for(int i=0; i<value.length; i++){
            h = 31*h+value[i];
        }
        hash = h;
    }
    return h;
}

这个方法是的属性有:public公有。
返回值:int
返回值说明:返回该字符串的散列值。

该方法的源码思路是:
<1>判断字符串的hash值是否为0,如果为0,并且长度大于0,则给hash进行赋值。
<2>返回hash值。

 

4. indexOf重载方法

 该方法返回实参字符在本字符串第一次出现的位置(下标),如果没有,则返回-1。

//从某下标开始,返回寻找第一个出现字符ch的下标,如果没找到则返回-1.
public int indexOf(int ch, int formIndex){
    final int max = value.length;
    if(formIndex < 0){
        formIndex = 0;
    }else if(formIndex >= max){
        return -1;
    }

    //Charater.MIN_SUPPLEMENTARY_CODE_POINT:65536 [0x10000]
    if(ch < Charater.MIN_SUPPLEMENTARY_CODE_POINT){
        final char[] value = this.value;
        for(int i=formIndex; i<max; i++){
            if(value[i] == ch){
                return i;
            }
        }
        return -1;
    }else{
        return indexOfSupplementary(ch,formIndex);
    }
}

//从本字符串开头开始寻找字符ch,找到则返回下标位置。没找到则返回-1
public int indexOf(int ch){
    return indexOf(ch, 0);
}

//source:      源字符数组(从该数组从寻找target数组的位置)
//sourceOffset:源字符数组的偏移位置(下标)
//sourceCount: 源字符数组的长度
//target:       要寻找的字符数组
//targetOffset:要寻找的字符数组的偏移位置
//targetCount: 要寻找的字符数组的长度
//formIndex:    要开始寻找的位置
static int indexOf(char[] source, int sourceOffset, int sourceCount, 
                    char[] target, int targetOfsset, int targetCount,
                    int fromIndex){
    if(fromIndex >= sourceCount){
        return (targetCount==0 ? sourceCount : -1);
    }
    if(fromIndex < 0){
        fromIndex = 0;
    }
    if(targetCount == 0){
        return fromIndex;
    }
    char first = target[targetOffset];
    //max这边是最大偏移的位置(下标)
    int max = sourceOffset + (sourceCount - targetCount);
    for(int i=sourceOffset+fromIndex; i<= max; i++){
        if(source[i] != first){
            while(++i <= max && sorce[i]!= first);
        }
        if(i < max){
            int j = i+1;
            int end = j+targetCount-1;
            for(int k=targetOffset+1; j<end&&source[i]==target[k]; j++,k++);
            if(j == end){
                return i-sourceOffset;
            }
        }
    }
    return -1
}

static int indexOf(char[] source, int sourceOffset, int sourceCount, 
                    String target, int fromIndex){
    return indexOf(source, sourceOffset, sourceCount, target.value, 0, 
                    target.value.length, fromIndex);
}

//从本字符串的下标fromIndex开始查找字符串str第一次出现的下标
public int indexOf(String str, int fromIndex){
    return indexOf(value, 0, value.length, 
                    str.value, 0, str.value.length, fromIndex);
}

//返回从本字符串开头开始查找字符串str第一次出现的下标
public int indexOf(String str){
    return (str, 0);
}

这个方法是的属性有:public公有。
参数:ch可以传一个字符,将会被解析成int类型【其值为Unicode的解码值】
参数:formIndex从本字符串开始比较的下标
返回值:int
返回值说明:寻找ch在本字符串中出现的位置,如果没找到则返回-1。

方法细节注意点:该方法中有句代码ch < Character.MIN_SUPPLEMENTARY_CODE_POINT,其中MIN_SUPPLEMENTARY_CODE_POINT等于十进制的65536,刚好是两个字节的界限。
该源码思路为:
<1>判断formIndex的位置,如果大于本字符串的长度,则返回-1。
<2>如果小于0,则下标按照0计算。然后进行寻找。
<3>如果找到字符则返回字符的位置,否则返回-1。

5. indexOfSupplementary(int ch, int fromIndex)方法

 这是String类中index方法中会调用的私有方法。

private int indexOfSupplementary(int ch, int fromIndex){
    if(Character.isValidCodePoint(ch)){
        final char[] value = this.value;
        final char hi = Character.hightSurrogate(ch);
        final char lo = Character.lowSurrogate(ch);
        final int max = value.length-1;
        for(int i = fromIndex; i<max; i++){
            if(value[i]==hi && value[i++]==lo){
                return i;
            }
        }
    }
    return -1;
}

这个方法是的属性有:private私有。
参数:ch可以传一个字符,将会被解析成int类型【其值为Unicode的解码值】
参数:formIndex从本字符串开始比较的下标
返回值:int
返回值说明:寻找ch在本字符串中出现的位置,如果没找到则返回-1。

方法补充:该方法是使用辅助字符来处理索引调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值