欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java源码___String类(七)

程序员文章站 2023-12-22 21:44:28
...

java.lang.String分析摘要:
<1>lastIndexOf重载方法
<2>substring重载方法
<3>subSequence(int beginIndex, int endIndex)
<4>concat(String str)
<5>replace重载方法

1.lastIndexOf重载方法
 该方法与indexOf方法相对应,该方法是用某个位置往前查找第一个出现所要查找字符的位置(下标)。

//从该字符串结尾处往前搜索第一次出现ch的坐标
public int lastIndexOf(int ch){
    return lastIndexOf(ch, value.length-1);
}

//从该字符串某个位置开始往前搜索第一次出现ch的坐标
public int lastIndexOf(int ch, int fromIndex){
    if(ch < Character.MIN_SUPPLEMENTARY_CODE_POINT){
        final char[] value = this.value;
        int i = Math.min(fromIndex, value.length-1);
        for(;i >=0 ; i--){
            if(value[i] == ch){
                return i;
            }
        }
        return -1;
    }else{
        return lastIndexOfSupplementary(ch, fromIndex);
    }
}

//lastIndexOfSupplementary方法是处理辅助字符的操作
private int lastIndexOfSupplementary(int ch, int fromIndex){
    if(Character.isValidCodePoint(ch)){
        final char[] value = this.value;
        char hi = Character.highSurrogate(ch);
        char lo = Character.lowSurrogate(ch);
        int i = Math.min(fromIndex, value.length-1);
        for(;i>=0;i--){
            if(value[i]==hi && value[i+1]==lo){
                return i;
            }
        }
    }
    return -1;
}

static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
            char[] target, int targetOffset, int targetCount, int fromIndex){
    int rightIndex = sourceCount - targetCount;
    if(formIndex <0 ){
        return -1;
    }
    if(fromIndex > rightIndex){
        fromIndex = rightIndex;
    }
    if(targetCount == 0){
        return fromIndex;
    }
    int strLastIndex = targetOffset + targetCount -1;
    char strLastChar = target[strLastIndex];
    int min = sourceOffset+sourceCount-1;
    int i = min + fromIndex;

startSearchForLastChar:
    while(true){
        while(i>=min && source[i]!=strLastChar){
            i--;
        }
        if(i<min){
            return -1;
        }
        int j = i-1;
        int start = j-(targetCount-1);
        int k = strLastIndex - 1;
        while(j > start){
            if(source[j--] != target[k--]){
                i--;
                continue startSearchForLastChar;
            }
        }
        return start-sourceOffset+1;
    }
}

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

public int lastIndexOf(String str, int fromIndex){
    return lastIndexOf(value,0,value.length,
                       str.value,0,str.value.length,fromIndex);
}

这个方法是的属性有:public公有的。
参数:ch要查找的字符
参数:fromIndex从后往前开始搜索的下标位置

返回值:int类型
返回值说明:如果找到则返回该字符的下标,否则返回-1。

2. substring重载方法
 该方法的作用是截取字符串,返回字符串的子串。

public String substring(int beginIndex){
    if(beginIndex <0 ){
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    int subLen = value.length - beginIndex;
    if(subLen < 0){
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return (beginIndex==0) ? this : new String(value, beginIndex, subLen);
}

public String substring(int beginIndex, int endIndex){
    if(beginIndex < 0){
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if(endIndex > value.length){
        throw new StirngIndexOutOfBoundsException(endIndex);
    }
    int subLen = endIndex - beginIndex;
    if(subLen < 0){
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return ((beginIndex==0) && (endIndex == value.length)) ? 
            this : new String(value, beginIndex, subLen);
}

这个方法是的属性有:public公有。
参数:beginIndex开始截取的下标位置
参数:endIndex 截取结束的下标位置
异常:StringIndexOutOfBoundsExcepiton
异常说明:如果开始截取的下标超过字符串的界限,则会抛出该异常。

返回值:String类型
返回值说明:返回截取的字符串。

该源码的思路是:
<1>判断下标是否超过字符串边界,如果超过边界则抛出S他ringIndexOfBoundsException异常。
<2>如果没问题,则用String的构造函数String(char[] value, int offset, int count)来构造一个字符串返回。

 

3.subSequence(int beginIndex, int endIndex)方法
 该方法返回一个字符序列,它是这个序列的一个子序列。

public CharSequence subSequence(int beginIndex, int endIndex){
    return this.subString(beginIndex, endIndex);
}

这个方法是的属性有:public公有。
返回值:CharSequence类型
返回值说明:CharSequence类型和String类型的主要区别是CharSequence是可读可写,而String是只读的。

该方法的源码思路是:
<1>底层本质调用的方法还是subString(int beginIndex, int endIndex)方法。

 

4. concat(String str)方法

 该方法的作用是将实参str追加到this字符串的末尾。

public String concat(String str){
    int otherLen = str.length;
    if(otherLen == 0){
        return this;
    }
    int len = value.length;
    char[] buf = Array.copyOf(value, len+otherLen);
    str.getChars(buf, len);
    return new String(buf,true);
}

这个方法是的属性有:public公有。
参数:str要追加的字符串
返回值:String
返回值说明:在本字符串的末尾拼接str字符串并返回。


该源码思路为:
<1>判断追加的字符串str是否为空字符串,是的话返回this字符串。
<2>创建新字符数组,长度为this和str的长度之和,然后将两者赋值到数组buf。
<3>用方法String(char[] value, boolean share)构建新字符串,将其返回。

5. replace重载方法

 该方法的基本作用是进行替换。

//会将本字符串中的出现的所有字符oldChar替换成newChar字符。
public String replace(char oldChar, char newChar){
    //判断替换和被替换的字符是否是同一个字符,如果是则不操作,返回this字符串。
    if(oldChar != newChar){
        int len = value.length;
        int i = -1;
        char[] val = value;

        //判断this字符串是否含有oldChar字符,如果没有,最后i=this字符串的长度
        while(++i < len){
            if(val[i] == oldChar){
                break;
            }
        }
        //如果this字符串包含oldChar字符
        if(i < len){
            char[] buf = new char[len];
            for(int j=0; j<i; j++){
                buf[j] = val[j];
            }
            //从第一个oldChar字符下标开始往后判断是否还有oldChar字符,有则替换
            while(i < len){
                char c = val[i];
                buf[i] = (c==oldChar)?newChar:c;
                i++;
            }
            return new String(buf,true);
        }
    }
    return this;
}

//将this字符串中出现的包含字符序列target的都替换成replacement
//target:目标字符,即this中要替换的字符
//replacement:替换成的字符串
public Stirng replace(CharSequence target, CharSequence replacement){
    return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
        this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}

这个方法是的属性有:public公有。
参数:oldChar要被替换的字符
参数:formIndex替换的字符
返回值:String类型
返回值说明:返回一个将this字符串中的oldChar字符替换成newChar字符的字符串。

参数:target目标字符,即this中要替换的字符
参数:replacement替换的字符串,将符合的字符序列替换成replacement
返回值:String类型
返回值说明:返回一个将this字符串中的包含target字符替换成replacement字符序列的字符串。

方法注意:LITERAL的英文单词是literal,其意思为照字面的; 原义的。也就是说按照target的表面字符来作替换,而非正则表达式。

上一篇:

下一篇: